Setup

library("tidyverse")
library("ggpubr")
library("zoo")
setwd("/mnt/LocalData/behaviour/aDN/aDN_behaviour")



Colours …

gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}
gg_color_hue(2)
[1] "#F8766D" "#00BFC4"



genotypes <- read_tsv("../2019_03_06_Courtship/genotype.tsv",col_names = TRUE)
genotypes



# indices_list <- list.files("raw data/") %>% str_subset("_Indices.csv")
indices_list <- list.files("../2019_03_06_Courtship/",recursive = TRUE) %>% str_subset("_Indices.csv") %>% str_subset("Male")
all_indices <- tibble()
for (indices_file in indices_list) {
  video_name <- indices_file %>% str_remove("/.*")
  temp <- read_csv(paste0("../2019_03_06_Courtship/",indices_file))
  temp <- temp %>%
    mutate(video = video_name)
  all_indices <- bind_rows(all_indices,temp)
}
all_indices
all_male_indices <- left_join(x = genotypes,y = all_indices,by=c("video"="video","fly_id"="FlyId"))



ggplot(all_male_indices,aes(x=genotype,y=CourtshipIndexWithFacing)) + 
  geom_boxplot()



p1 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipIndex)) + 
  geom_boxplot()
p2 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipIndexWithFacing)) + 
  geom_boxplot()
p3 <- ggplot(all_male_indices,aes(x=genotype,y=TotalCCI)) + 
  geom_boxplot()
p4 <- ggplot(all_male_indices,aes(x=genotype,y=TotalCCIwFacing)) + 
  geom_boxplot()
ggarrange(plotlist = list(p1,p2,p3,p4),
          # labels = c("ApproachingIndex",
          #            "ContactIndex",
          #            "EncirclingIndex",
          #            "FacingIndex",
          #            "TurningIndex",
          #            "WingIndex"),
          # hjust = 1,
          ncol = 4,
          nrow = 1)



p1 <- ggplot(all_male_indices,aes(x=genotype,y=ApproachingIndex)) + 
  geom_boxplot()
p2 <- ggplot(all_male_indices,aes(x=genotype,y=ContactIndex)) + 
  geom_boxplot()
p3 <- ggplot(all_male_indices,aes(x=genotype,y=EncirclingIndex)) + 
  geom_boxplot()
p4 <- ggplot(all_male_indices,aes(x=genotype,y=FacingIndex)) + 
  geom_boxplot()
p5 <- ggplot(all_male_indices,aes(x=genotype,y=TurningIndex)) + 
  geom_boxplot()
p6 <- ggplot(all_male_indices,aes(x=genotype,y=WingIndex)) + 
  geom_boxplot()
ggarrange(plotlist = list(p1,p2,p3,p4,p5,p6),
          # labels = c("ApproachingIndex",
          #            "ContactIndex",
          #            "EncirclingIndex",
          #            "FacingIndex",
          #            "TurningIndex",
          #            "WingIndex"),
          # hjust = 1,
          ncol = 3,
          nrow = 2)



p1 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipInitiation)) + 
  geom_boxplot()
p2 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipTermination)) + 
  geom_boxplot()
p3 <- ggplot(all_male_indices,aes(x=genotype,y=CourtshipDuration)) + 
  geom_boxplot()
ggarrange(plotlist = list(p1,p2,p3),
          ncol = 3,
          nrow = 1)



df <- all_male_indices %>%
  select(genotype,CourtshipTermination) %>% 
  group_by(genotype) %>% 
  mutate(len=length(CourtshipTermination))
#ggplot(df,aes(x=CourtshipTermination,color=genotype)) + geom_step(aes(len=len,y=..y.. * len),stat="ecdf") 
ggplot(df,aes(x=CourtshipTermination,color=genotype)) + geom_step(aes(y=..y..),stat="ecdf")



df <- all_male_indices %>%
  select(genotype,CourtshipDuration) %>% 
  group_by(genotype) %>% 
  mutate(len=length(CourtshipDuration))
#ggplot(df,aes(x=CourtshipDuration,color=genotype)) + geom_step(aes(len=len,y=..y.. * len),stat="ecdf") 
ggplot(df,aes(x=CourtshipDuration,color=genotype)) + geom_step(aes(y=..y..),stat="ecdf")



p1 <- ggplot(all_male_indices,aes(x=genotype,y=ApproachingBoutLength)) + 
  geom_boxplot()
p2 <- ggplot(all_male_indices,aes(x=genotype,y=ContactBoutLength)) + 
  geom_boxplot()
p3 <- ggplot(all_male_indices,aes(x=genotype,y=EncirclingBoutLength)) + 
  geom_boxplot()
p4 <- ggplot(all_male_indices,aes(x=genotype,y=FacingBoutLength)) + 
  geom_boxplot()
p5 <- ggplot(all_male_indices,aes(x=genotype,y=TurningBoutLength)) + 
  geom_boxplot()
p6 <- ggplot(all_male_indices,aes(x=genotype,y=WingBoutLength)) + 
  geom_boxplot()
p7 <- ggplot(all_male_indices,aes(x=genotype,y=ApproachingBoutInterval)) + 
  geom_boxplot()
p8 <- ggplot(all_male_indices,aes(x=genotype,y=ContactBoutInterval)) + 
  geom_boxplot()
p9 <- ggplot(all_male_indices,aes(x=genotype,y=EncirclingBoutInterval)) + 
  geom_boxplot()
p10 <- ggplot(all_male_indices,aes(x=genotype,y=FacingBoutInterval)) + 
  geom_boxplot()
p11 <- ggplot(all_male_indices,aes(x=genotype,y=TurningBoutInterval)) + 
  geom_boxplot()
p12 <- ggplot(all_male_indices,aes(x=genotype,y=WingBoutInterval)) + 
  geom_boxplot()
ggarrange(plotlist = list(p1,p2,p3,p4,p5,p6,
                          p7,p8,p9,p10,p11,p12),
          # labels = c("ApproachingIndex",
          #            "ContactIndex",
          #            "EncirclingIndex",
          #            "FacingIndex",
          #            "TurningIndex",
          #            "WingIndex"),
          # hjust = 1,
          ncol = 6,
          nrow = 2)





#all_rawdata <- full_join(x = all_rawdata, y = genotypes, by = c("FileName"="video","Id"="fly_id"))
all_rawdata <- all_rawdata %>%
  full_join(x = all_rawdata, y = genotypes, by = c("FileName"="video","Id"="fly_id")) %>% 
  replace_na(list(genotype = "CS female"))
# sum(is.na(all_rawdata$genotype))
# summary(all_rawdata$genotype)
# unique(all_rawdata$genotype)
all_rawdata







# # Extract density data to average
# p <- ggplot_build(test_plot)
# ggplot(as.data.frame(p$data[[1]]), aes(x,y)) + geom_line()
# ggplot(as.data.frame(p$data[[2]]), aes(x,y)) + geom_line()































D genotype distance to other









all_rawdata <- all_rawdata %>%  
  unite("unique_fly",FileName,Id, remove = FALSE) %>% 
  group_by(unique_fly) %>% 
  mutate(
    Multitasking = (Approaching + Encircling + Contact + Turning + WingGesture),
    MultitaskingWithFacing = (Approaching + Encircling + Facing + Contact + Turning + WingGesture),
    Courtship = ifelse(Multitasking>=1, 1, 0),
    CourtshipWithFacing = ifelse(MultitaskingWithFacing>=1, 1, 0),
    MultitaskingWithCopulation = (Approaching + Encircling + Contact + Turning + WingGesture + Copulation),
    MultitaskingWithCopulationWithFacing = (Approaching + Encircling + Facing + Contact + Turning + WingGesture + Copulation),
    CourtshipAndCopulation = ifelse(MultitaskingWithCopulation>=1, 1, 0),
    CourtshipAndCopulationWthFacing = ifelse(MultitaskingWithCopulationWithFacing>=1, 1, 0),
    SmoothedCourtship = ifelse((rollmean(Courtship, 150, fill = c(0,0,0), align = c("left")))>0.5, 1, 0),
    SmoothedCopulation = ifelse((rollmean(Copulation, 1250, fill = c(0,0,0), align = c("center")))>0.5, 1, 0),
    SmoothedDistToOther = ifelse((rollmean(ifelse(dist_to_other__mm > 2, 1, 0), 250, fill = c(1,1,NA), align = c("center")))>0.5, 1, 0)
)

























D genotype distance to other

































mean distance to other





median distance to other





mean facing angle





median facing angle





test_stat_tibble0 <- all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  group_by(genotype) %>% 
  filter(dist_to_other__mm > 2) %>% 
  #filter(max_wing_ang__rad > (35*pi/180)) %>%
  unite("individual", FileName:Id, remove = FALSE) %>% 
  group_by(individual) %>% 
  summarise(median_facing_angle = median(facing_angle__rad),
            genotype = unique(genotype))
aov0 <- aov(median_facing_angle~genotype,data = test_stat_tibble0)
summary(aov0)
             Df Sum Sq Mean Sq F value Pr(>F)  
genotype      3  1.036  0.3453   2.736 0.0468 *
Residuals   114 14.388  0.1262                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(aov0)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = median_facing_angle ~ genotype, data = test_stat_tibble0)

$genotype
           diff           lwr       upr     p adj
B-A -0.07051500 -0.3361762470 0.1951462 0.8999385
C-A  0.04970748 -0.1803176760 0.2797326 0.9426712
D-A  0.19276677 -0.0389146073 0.4244482 0.1380793
C-B  0.12022248 -0.1408020849 0.3812470 0.6275505
D-B  0.26328177  0.0007965104 0.5257670 0.0490063
D-C  0.14305929 -0.0832904123 0.3694090 0.3562046





median facing angle by sector





mean facing angle by sector





mean facing angle by wee sectors





counts in wee sectors





Total time in sector





Proportion time in sector



test_stat_tibble0 <- all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  filter(dist_to_other__mm > 2) %>% 
  filter(max_wing_ang__rad > (35*pi/180)) %>%
  group_by(unique_fly) %>% 
  summarise(counts = 100*sum(facing_angle__rad > pi/8)/length(Frame),
            genotype = unique(genotype))
aov0 <- aov(counts~genotype,data = test_stat_tibble0)
#summary(aov0)
TukeyHSD(aov0)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = counts ~ genotype, data = test_stat_tibble0)

$genotype
          diff        lwr       upr     p adj
B-A  6.6367127 -2.5650354 15.838461 0.2421768
C-A  7.3146600 -0.6527555 15.282076 0.0840396
D-A 16.6152204  8.5904380 24.640003 0.0000022
C-B  0.6779474 -8.3631993  9.719094 0.9973376
D-B  9.9785077  0.8867666 19.070249 0.0254776
D-C  9.3005603  1.4604520 17.140669 0.0131217



pairwise.t.test(test_stat_tibble0$counts, test_stat_tibble0$genotype)

    Pairwise comparisons using t tests with pooled SD 

data:  test_stat_tibble0$counts and test_stat_tibble0$genotype 

  A       B     C    
B 0.125   -     -    
C 0.055   0.845 -    
D 2.2e-06 0.020 0.012

P value adjustment method: holm 







Total time in sector





Proportion time in sector and within 10mm



test_stat_tibble0 <- all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  filter(dist_to_other__mm > 2) %>% 
  filter(dist_to_other__mm < 10) %>% 
  filter(max_wing_ang__rad > (35*pi/180)) %>%
  group_by(unique_fly) %>% 
  summarise(counts = 100*sum(facing_angle__rad > pi/8)/length(Frame),
            genotype = unique(genotype))
aov0 <- aov(counts~genotype,data = test_stat_tibble0)
#summary(aov0)
TukeyHSD(aov0)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = counts ~ genotype, data = test_stat_tibble0)

$genotype
          diff        lwr       upr     p adj
B-A  4.2169183 -3.2364908 11.670328 0.4558215
C-A  4.8104624 -1.6431383 11.264063 0.2159140
D-A 11.2681432  4.7680753 17.768211 0.0000889
C-B  0.5935441 -6.7297782  7.916866 0.9966463
D-B  7.0512248 -0.3130788 14.415528 0.0658244
D-C  6.4576807  0.1071987 12.808163 0.0446836



pairwise.t.test(test_stat_tibble0$counts, test_stat_tibble0$genotype)

    Pairwise comparisons using t tests with pooled SD 

data:  test_stat_tibble0$counts and test_stat_tibble0$genotype 

  A       B     C    
B 0.286   -     -    
C 0.163   0.833 -    
D 9.1e-05 0.056 0.046

P value adjustment method: holm 

















Total count in inner ring





Proportion count in inner ring



test_stat_tibble0 <- all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  filter(facing_angle__rad <= pi/8) %>% 
  filter(max_wing_ang__rad > (25*pi/180)) %>%
  group_by(unique_fly) %>% 
  summarise(counts = 100*sum(dist_to_other__mm > 2 & dist_to_other__mm <= 3)/length(Frame),
            genotype = unique(genotype))
aov0 <- aov(counts~genotype,data = test_stat_tibble0)
#summary(aov0)
TukeyHSD(aov0)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = counts ~ genotype, data = test_stat_tibble0)

$genotype
          diff        lwr      upr     p adj
B-A  2.7255382  -8.488600 13.93968 0.9209524
C-A  2.5367905  -7.173071 12.24665 0.9040570
D-A 21.8215793  12.041805 31.60135 0.0000003
C-B -0.1887477 -11.207161 10.82967 0.9999678
D-B 19.0960411   8.015968 30.17611 0.0000986
D-C 19.2847888   9.730076 28.83950 0.0000040







Left vs Right wing







test_stat_tibble <- all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  #filter(genotype != "A") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            both_wing_index = 100*sum(min_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(35*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     ))
aov1 <- aov(both_wing_index~genotype, data = test_stat_tibble)
TukeyHSD(aov1)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = both_wing_index ~ genotype, data = test_stat_tibble)

$genotype
          diff        lwr      upr     p adj
B-A -0.4779248 -2.0714700 1.115620 0.8624926
C-A -0.1148557 -1.4946410 1.264930 0.9963700
D-A  0.8787432 -0.5109769 2.268463 0.3557950
C-B  0.3630691 -1.2026635 1.928802 0.9304240
D-B  1.3566679 -0.2178265 2.931162 0.1170595
D-C  0.9935989 -0.3641396 2.351337 0.2304436







test_stat_tibble <- all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  #filter(genotype != "A") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            both_wing_index = 100*sum(min_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]>(15*pi/180),
                                 na.rm = TRUE)/
              length(Frame[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ]
                     ))
aov1 <- aov(both_wing_index~genotype, data = test_stat_tibble)
TukeyHSD(aov1)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = both_wing_index ~ genotype, data = test_stat_tibble)

$genotype
          diff       lwr       upr     p adj
B-A  1.3374241 -4.537783  7.212632 0.9338504
C-A  1.9198669 -3.167234  7.006968 0.7588352
D-A 10.3410421  5.217313 15.464771 0.0000040
C-B  0.5824427 -5.190223  6.355108 0.9935904
D-B  9.0036180  3.198649 14.808587 0.0005495
D-C  8.4211753  3.415359 13.426992 0.0001503







all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            mean_min_wing = mean(min_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])
            ) %>%
  ggplot(aes(x=genotype,y=mean_min_wing)) +
    geom_boxplot() +
    ylim(0,.5)



all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  summarise(genotype = unique(genotype),
            min_wing_gt_15 = sum(mean(min_wing_ang__rad[which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                                                 ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                                        which.max(SmoothedCopulation), 
                                                                                        min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                        ),
                                                                                  min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                                  )
                                             ])>15*pi/180)
            ) %>% 
  summarise(prop_min_wing_gt_15 = 100*sum(min_wing_gt_15>0,na.rm = TRUE)/length(min_wing_gt_15))





















all_rawdata %>% 
  filter(dist_to_other__mm > 2) %>% 
  filter(dist_to_other__mm < 10) %>% 
  filter(max_wing_ang__rad > (25*pi/180)) %>%
  #filter(genotype == "D") %>% 
  ggplot(aes(x=genotype, y=wing_l_len__px))+
  geom_boxplot()







Facing angle at start vs end of wing bout



Warning messages:
1: Unknown or uninitialised column: 'bin_max_wing'. 
2: Unknown or uninitialised column: 'bin_max_wing'. 
3: Unknown or uninitialised column: 'bin_max_wing'. 
4: Unknown or uninitialised column: 'bin_max_wing'. 
5: Unknown or uninitialised column: 'bin_max_wing'. 
6: Unknown or uninitialised column: 'bin_max_wing'. 
7: Unknown or uninitialised column: 'bin_max_wing'. 
8: Unknown or uninitialised column: 'bin_max_wing'. 









Facing angle at start and end of each bout

temp <- all_rawdata %>% 
  filter(genotype!="CS female") %>% 
  filter(dist_to_other__mm > 2)
  
uniq_fly <- unique(temp$unique_fly)
facing_start_and_end_wing <- tibble()
for (fly in uniq_fly) {
  temp2 <- filter(temp, unique_fly == fly)
  bouts <- rle(temp2$WingGesture)
  
  starts <- as.numeric()
  for (i in seq(1,length(which(bouts$values==1)),1)) {
    starts[i] = sum(bouts$lengths[1:(i*2)-1])+1
  }
  ends <- as.numeric()
  for (i in seq(1,length(which(bouts$values==1)),1)) {
    ends[i] = sum(bouts$lengths[1:(i*2)])
  }
  genotype = rep(unique(temp2$genotype),length(which(bouts$values==1)))
  uni_id = rep(unique(temp2$unique_fly),length(which(bouts$values==1)))
  
  temp_tibble <- tibble(unique_fly = uni_id,
                        genotype = genotype,
                        facing_at_start = temp2$facing_angle__rad[starts],
                        facing_at_end = temp2$facing_angle__rad[ends]
                        )
  facing_start_and_end_wing <- bind_rows(facing_start_and_end_wing,temp_tibble)
}
facing_start_and_end_wing













Mean facing angle at start and end of bout

temp <- all_rawdata %>% 
  filter(genotype!="CS female") %>% 
  filter(dist_to_other__mm > 2)
  
uniq_fly <- unique(temp$unique_fly)
facing_start_and_end_wing <- tibble()
for (fly in uniq_fly) {
  temp2 <- filter(temp, unique_fly == fly)
  bouts <- rle(temp2$WingGesture)
  
  starts <- as.numeric()
  for (i in seq(1,length(which(bouts$values==1)),1)) {
    starts[i] = sum(bouts$lengths[1:(i*2)-1])+1
  }
  ends <- as.numeric()
  for (i in seq(1,length(which(bouts$values==1)),1)) {
    ends[i] = sum(bouts$lengths[1:(i*2)])
  }
  genotype = unique(temp2$genotype)
  uni_id = unique(temp2$unique_fly)
  
  temp_tibble <- tibble(unique_fly = uni_id,
                        genotype = genotype,
                        facing_at_start = mean(temp2$facing_angle__rad[starts]),
                        facing_at_end = mean(temp2$facing_angle__rad[ends])
                        )
  facing_start_and_end_wing <- bind_rows(facing_start_and_end_wing,temp_tibble)
}
facing_start_and_end_wing







Median facing angle at start and end of bout (using WingGesture)

temp <- all_rawdata %>% 
  filter(genotype!="CS female") %>% 
  filter(dist_to_other__mm > 2)
  
uniq_fly <- unique(temp$unique_fly)
facing_start_and_end_wing <- tibble()
for (fly in uniq_fly) {
  temp2 <- filter(temp, unique_fly == fly)
  bouts <- rle(temp2$WingGesture)
  
  starts <- as.numeric()
  for (i in seq(1,length(which(bouts$values==1)),1)) {
    starts[i] = sum(bouts$lengths[1:(i*2)-1])+1
  }
  ends <- as.numeric()
  for (i in seq(1,length(which(bouts$values==1)),1)) {
    ends[i] = sum(bouts$lengths[1:(i*2)])
  }
  genotype = unique(temp2$genotype)
  uni_id = unique(temp2$unique_fly)
  
  temp_tibble <- tibble(unique_fly = uni_id,
                        genotype = genotype,
                        facing_at_start = median(temp2$facing_angle__rad[starts]),
                        facing_at_end = median(temp2$facing_angle__rad[ends])
                        )
  facing_start_and_end_wing <- bind_rows(facing_start_and_end_wing,temp_tibble)
}
facing_start_and_end_wing







Median facing angle at start and end of bout (using >35deg)

temp <- all_rawdata %>% 
  filter(genotype!="CS female") %>% 
  filter(dist_to_other__mm > 2)
Warning messages:
1: Unknown or uninitialised column: 'bin_max_wing'. 
2: Unknown or uninitialised column: 'bin_max_wing'. 
3: Unknown or uninitialised column: 'bin_max_wing'. 
4: Unknown or uninitialised column: 'bin_max_wing'. 
  
uniq_fly <- unique(temp$unique_fly)
facing_start_and_end_wing <- tibble()
for (fly in uniq_fly) {
  temp2 <- filter(temp, unique_fly == fly)
  #bouts <- rle(temp2$WingGesture)
  temp2$bin_max_wing <- ifelse(temp2$max_wing_ang__rad >= (35*pi/180),1,0)
  temp2$bin_max_wing <- temp2$bin_max_wing %>% replace_na(0)
  bouts <- rle(temp2$bin_max_wing)
  starts <- as.numeric()
  for (i in seq(1,length(which(bouts$values==1)),1)) {
    starts[i] = sum(bouts$lengths[1:(i*2)-1])+1
  }
  ends <- as.numeric()
  for (i in seq(1,length(which(bouts$values==1)),1)) {
    ends[i] = sum(bouts$lengths[1:(i*2)])
  }
  genotype = unique(temp2$genotype)
  uni_id = unique(temp2$unique_fly)
  
  temp_tibble <- tibble(unique_fly = uni_id,
                        genotype = genotype,
                        facing_at_start = median(temp2$facing_angle__rad[starts]),
                        facing_at_end = median(temp2$facing_angle__rad[ends])
                        )
  facing_start_and_end_wing <- bind_rows(facing_start_and_end_wing,temp_tibble)
}
facing_start_and_end_wing







Facing angles with wing extended using WingGesture





Facing angles with wing extended using max_wing>35



test_stat_tibble0 <- all_rawdata %>% 
  filter(genotype!="CS female") %>% 
  group_by(unique_fly) %>% 
  filter(dist_to_other__mm > 2) %>% 
  filter(max_wing_ang__rad > (35*pi/180)) %>%
  summarise(genotype = unique(genotype),
            facing = median(facing_angle__rad)) 
aov0 <- aov(facing~genotype,data = test_stat_tibble0)
#summary(aov0)
TukeyHSD(aov0)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = facing ~ genotype, data = test_stat_tibble0)

$genotype
            diff        lwr       upr     p adj
B-A -0.064278836 -0.2941883 0.1656306 0.8852971
C-A -0.017473865 -0.2165430 0.1815953 0.9957523
D-A -0.012774271 -0.2132767 0.1877282 0.9983603
C-B  0.046804972 -0.1790918 0.2727017 0.9489797
D-B  0.051504566 -0.1756563 0.2786654 0.9345696
D-C  0.004699594 -0.1911887 0.2005879 0.9999116











test <- all_rawdata %>% 
  filter(FileName == "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2") %>% 
  filter(Id == 36) 
temp2 <- test
Warning messages:
1: Unknown or uninitialised column: 'bin_max_wing'. 
2: Unknown or uninitialised column: 'bin_max_wing'. 
3: Unknown or uninitialised column: 'bin_max_wing'. 
4: Unknown or uninitialised column: 'bin_max_wing'. 
#bouts <- rle(temp2$WingGesture)
temp2$bin_max_wing <- ifelse(temp2$max_wing_ang__rad > (35*pi/180),1,0)
temp2$bin_max_wing <- temp2$bin_max_wing %>% replace_na(0)
bouts <- rle(temp2$bin_max_wing)
starts <- as.numeric()
for (i in seq(1,length(which(bouts$values==1)),1)) {
  starts[i] = sum(bouts$lengths[1:(i*2)-1])+1
}
ends <- as.numeric()
for (i in seq(1,length(which(bouts$values==1)),1)) {
  ends[i] = sum(bouts$lengths[1:(i*2)])
}
genotype = rep(unique(temp2$genotype),length(which(bouts$values==1)))
uni_id = rep(unique(temp2$unique_fly),length(which(bouts$values==1)))
temp_tibble <- tibble(unique_fly = uni_id,
                      genotype = genotype,
                      facing_at_start = temp2$facing_angle__rad[starts],
                      facing_at_end = temp2$facing_angle__rad[ends]
                      )
temp_tibble
starts = for (i in seq(1,length(which(bouts$values==1)),1)) {
                                           starts[i] = sum(bouts$lengths[1:(i*2)-1])+1
                                         }
starts
NULL
test$bin_max_wing <- ifelse(test$max_wing_ang__rad > (35*pi/180),1,0)
test$bin_max_wing <- test$bin_max_wing %>% replace_na(0)
#test$bin_max_wing
bouts <- rle(test$bin_max_wing)
bouts
Run Length Encoding
  lengths: int [1:393] 675 3 2 14 2 22 212 15 15 2 ...
  values : num [1:393] 0 1 0 1 0 1 0 1 0 1 ...
bouts <- rle(test$WingGesture)
bouts
Run Length Encoding
  lengths: int [1:1361] 666 5 3 45 198 1 2 5 4 17 ...
  values : num [1:1361] 0 1 0 1 0 1 0 1 0 1 ...

sum(test$bin_max_wing[which.max(test$SmoothedCourtship):which.max(test$SmoothedCopulation)]==test$WingGesture[which.max(test$SmoothedCourtship):which.max(test$SmoothedCopulation)])
[1] 1230
sum(test$bin_max_wing[which.max(test$SmoothedCourtship):which.max(test$SmoothedCopulation)]!=test$WingGesture[which.max(test$SmoothedCourtship):which.max(test$SmoothedCopulation)])
[1] 35

gg_color_hue(4)
[1] "#F8766D" "#7CAE00" "#00BFC4" "#C77CFF"

max(test$Frame)
[1] 5974
temp2 <- all_rawdata %>% 
  filter(FileName == "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_123_3") %>% 
  filter(Id == 1) %>% 
  filter(dist_to_other__mm > 2)
#bouts <- rle(temp2$WingGesture)
temp2$bin_max_wing <- ifelse(temp2$max_wing_ang__rad >= (35*pi/180),1,0)
temp2$bin_max_wing <- temp2$bin_max_wing %>% replace_na(0)
bouts <- rle(test$bin_max_wing)
starts <- as.numeric()
for (i in seq(1,length(which(bouts$values==1)),1)) {
  starts[i] = sum(bouts$lengths[1:(i*2)-1])+1
}
ends <- as.numeric()
for (i in seq(1,length(which(bouts$values==1)),1)) {
  ends[i] = sum(bouts$lengths[1:(i*2)])
}
genotype = unique(temp2$genotype)
uni_id = unique(temp2$unique_fly)
temp_tibble <- tibble(unique_fly = uni_id,
                      genotype = genotype,
                      facing_at_start = median(temp2$facing_angle__rad[starts]),
                      facing_at_end = median(temp2$facing_angle__rad[ends])
                      )
temp_tibble
bouts <- rle(test$bin_max_wing)
bouts
Run Length Encoding
  lengths: int [1:198] 631 3 57 5 363 34 357 1 23 1 ...
  values : num [1:198] 0 1 0 1 0 1 0 1 0 1 ...

Trying to make functions for courtship window and calculate indices… they aren’t working right, and seem to be ignoring the grouping of the tibble and returning the same value for every individual…

If i have to for loop over the groups of a tibble, the below line might be usefull. dim(unique(all_rawdata[all_rawdata %>% group_by(genotype) %>% group_vars()]))[1]

courtship_window <- function(input,wind=600,...){
  temp_tibble <- summarise(input, start_of_courtship = which.max(SmoothedCourtship),
                                  end_of_courtship = ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                             ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                    which.max(SmoothedCopulation), 
                                                                    min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                    ),
                                                              min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                              )
                        )
  return(temp_tibble$start_of_courtship:temp_tibble$end_of_courtship)
  #return(c(temp_tibble$start_of_courtship,temp_tibble$end_of_courtship))
  #return(temp_tibble)
}
courtship_window <- function(input,wind=600,...){
  temp_tibble <- summarise(input, start_of_courtship = which.max(SmoothedCourtship),
                                  end_of_courtship = ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                             ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                    which.max(SmoothedCopulation), 
                                                                    min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                    ),
                                                              min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                              )
                        )
  #return(temp_tibble$start_of_courtship:temp_tibble$end_of_courtship)
  return(c(temp_tibble$start_of_courtship,temp_tibble$end_of_courtship))
  #return(temp_tibble)
}
courtship_window(test, wind = 600)
temp <- all_rawdata %>% 
  filter(genotype!="CS female")

uniq_fly <- unique(temp$unique_fly)
courting_frames <- tibble()
for (fly in uniq_fly) {
  temp2 <- temp %>% filter(unique_fly == fly) 
  temp2 <- slice(temp2, which.max(SmoothedCourtship):ifelse(which.max(SmoothedCopulation) > which.max(SmoothedCourtship),
                                                             ifelse(which.max(SmoothedCopulation) <= (which.max(SmoothedCourtship)+(25*wind)), 
                                                                    which.max(SmoothedCopulation), 
                                                                    min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                                    ),
                                                              min((which.max(SmoothedCourtship)+(25*wind)),max(Frame))
                                                              ))
  courting_frames <- bind_rows(courting_frames,temp2)
}
courting_frames
calculate_indices <- function(input = .,feature,jaaba=TRUE,thresh=NULL,wind=600){
  if (feature %in% names(input)) {
    var_ind = paste0(feature,"_index")
    if (jaaba) {
      temp_tibble <- summarise(input, genotype = unique(genotype), 
                                      !!var_ind := 100*sum(input[[feature]][which.max(input[["SmoothedCourtship"]]):ifelse(which.max(input[["SmoothedCopulation"]]) > which.max(input[["SmoothedCourtship"]]),
                                                       ifelse(which.max(input[["SmoothedCopulation"]]) <= (which.max(input[["SmoothedCourtship"]])+(25*wind)), 
                                                              which.max(input[["SmoothedCopulation"]]), 
                                                              min((which.max(input[["SmoothedCourtship"]])+(25*wind)),max(input[["Frame"]]))
                                                              ),
                                                        min((which.max(input[["SmoothedCourtship"]])+(25*wind)),max(input[["Frame"]]))
                                                        )])/
                                                    length(input[["Frame"]][which.max(input[["SmoothedCourtship"]]):ifelse(which.max(input[["SmoothedCopulation"]]) > which.max(input[["SmoothedCourtship"]]),
                                                       ifelse(which.max(input[["SmoothedCopulation"]]) <= (which.max(input[["SmoothedCourtship"]])+(25*wind)), 
                                                              which.max(input[["SmoothedCopulation"]]), 
                                                              min((which.max(input[["SmoothedCourtship"]])+(25*wind)),max(input[["Frame"]]))
                                                              ),
                                                        min((which.max(input[["SmoothedCourtship"]])+(25*wind)),max(input[["Frame"]]))
                                                        )])
                )
    } else {
      temp_tibble <- summarise(input, genotype = unique(genotype), 
                                      !!var_ind := 100*sum(input[[feature]][which.max(input[["SmoothedCourtship"]]):ifelse(which.max(input[["SmoothedCopulation"]]) > which.max(input[["SmoothedCourtship"]]),
                                                       ifelse(which.max(input[["SmoothedCopulation"]]) <= (which.max(input[["SmoothedCourtship"]])+(25*wind)), 
                                                              which.max(input[["SmoothedCopulation"]]), 
                                                              min((which.max(input[["SmoothedCourtship"]])+(25*wind)),max(input[["Frame"]]))
                                                              ),
                                                        min((which.max(input[["SmoothedCourtship"]])+(25*wind)),max(input[["Frame"]]))
                                                        )]>thresh,na.rm = TRUE)/
                                                    length(input[["Frame"]][which.max(input[["SmoothedCourtship"]]):ifelse(which.max(input[["SmoothedCopulation"]]) > which.max(input[["SmoothedCourtship"]]),
                                                       ifelse(which.max(input[["SmoothedCopulation"]]) <= (which.max(input[["SmoothedCourtship"]])+(25*wind)), 
                                                              which.max(input[["SmoothedCopulation"]]), 
                                                              min((which.max(input[["SmoothedCourtship"]])+(25*wind)),max(input[["Frame"]]))
                                                              ),
                                                        min((which.max(input[["SmoothedCourtship"]])+(25*wind)),max(input[["Frame"]]))
                                                        )])
                )
    }
    return(temp_tibble)
  } else {
    message(paste0(feature, " does not exist in table"))
  }
} 
calculate_indices <- function(input,feature,jaaba=TRUE,thresh=NULL){
  if (feature %in% names(input)) {
    var_ind = paste0(feature,"_index")
    if (jaaba) {
      temp_tibble <- summarise(input, genotype = unique(genotype), 
                                      !!var_ind := 100*sum(input[[feature]][courtship_window(input)])/
                                                    length(input[["Frame"]][courtship_window(input)])
                )
    } else {
      temp_tibble <- summarise(input, genotype = unique(genotype), 
                                      !!var_ind := 100*sum(input[[feature]][courtship_window(input)]>thresh,na.rm = TRUE)/
                                                    length(input[["Frame"]][courtship_window(input)])
                )
    }
    return(temp_tibble)
  } else {
    message(paste0(feature, " does not exist in table"))
  }
} 
all_rawdata %>% 
  filter(genotype != "CS female") %>% 
  filter(genotype == "D") %>% 
  group_by(genotype) %>% 
  group_by(unique_fly) %>% 
  calculate_indices(feature = "max_wing_ang__rad",jaaba = FALSE,thresh = (25*pi/180))
test <- all_rawdata %>% 
  filter(FileName == "Megan-2019_03_06_Courtship-DsxVglutTNT_Male_1234_2") %>% 
  filter(Id == 36) 
calculate_indices(input = test,feature = "WingGesture",jaaba = TRUE)
calculate_indices(input = test,feature = "max_wing_ang__rad",jaaba = FALSE,thresh = (25*pi/180))
calculate_indices(input = test,feature = "max_wing_angle__rad",jaaba = FALSE,thresh = (25*pi/180))
LS0tCnRpdGxlOiAiKipNYWxlIGNvdXJ0c2hpcCBiZWhhdmlvdXIgLSBhRE4gPiBUTlQqKiIKYXV0aG9yOiAiQWFyb24gTS4gQWxsZW4iCmRhdGU6ICIyNCBGZWJydWFyeSAyMDIwIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgo8YnIvPgo8YnIvPgoKIyAqKlNldHVwKioKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoInRpZHl2ZXJzZSIpCmxpYnJhcnkoImdncHViciIpCmxpYnJhcnkoInpvbyIpCnNldHdkKCIvbW50L0xvY2FsRGF0YS9iZWhhdmlvdXIvYUROL2FETl9iZWhhdmlvdXIiKQpgYGAKCgo8YnIvPgo8YnIvPgoKCiMjIyBDb2xvdXJzIC4uLgogCmBgYHtyfQpnZ19jb2xvcl9odWUgPC0gZnVuY3Rpb24obikgewogIGh1ZXMgPSBzZXEoMTUsIDM3NSwgbGVuZ3RoID0gbiArIDEpCiAgaGNsKGggPSBodWVzLCBsID0gNjUsIGMgPSAxMDApWzE6bl0KfQpgYGAKCmBgYHtyfQpnZ19jb2xvcl9odWUoMikKYGBgCgoKCjxici8+Cjxici8+CgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9Cmdlbm90eXBlcyA8LSByZWFkX3RzdigiLi4vMjAxOV8wM18wNl9Db3VydHNoaXAvZ2Vub3R5cGUudHN2Iixjb2xfbmFtZXMgPSBUUlVFKQpnZW5vdHlwZXMKYGBgCgoKCjxici8+Cjxici8+CgoKCgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CiMgaW5kaWNlc19saXN0IDwtIGxpc3QuZmlsZXMoInJhdyBkYXRhLyIpICU+JSBzdHJfc3Vic2V0KCJfSW5kaWNlcy5jc3YiKQppbmRpY2VzX2xpc3QgPC0gbGlzdC5maWxlcygiLi4vMjAxOV8wM18wNl9Db3VydHNoaXAvIixyZWN1cnNpdmUgPSBUUlVFKSAlPiUgc3RyX3N1YnNldCgiX0luZGljZXMuY3N2IikgJT4lIHN0cl9zdWJzZXQoIk1hbGUiKQphbGxfaW5kaWNlcyA8LSB0aWJibGUoKQpmb3IgKGluZGljZXNfZmlsZSBpbiBpbmRpY2VzX2xpc3QpIHsKICB2aWRlb19uYW1lIDwtIGluZGljZXNfZmlsZSAlPiUgc3RyX3JlbW92ZSgiLy4qIikKICB0ZW1wIDwtIHJlYWRfY3N2KHBhc3RlMCgiLi4vMjAxOV8wM18wNl9Db3VydHNoaXAvIixpbmRpY2VzX2ZpbGUpKQogIHRlbXAgPC0gdGVtcCAlPiUKICAgIG11dGF0ZSh2aWRlbyA9IHZpZGVvX25hbWUpCiAgYWxsX2luZGljZXMgPC0gYmluZF9yb3dzKGFsbF9pbmRpY2VzLHRlbXApCn0KYWxsX2luZGljZXMKYGBgCgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQphbGxfbWFsZV9pbmRpY2VzIDwtIGxlZnRfam9pbih4ID0gZ2Vub3R5cGVzLHkgPSBhbGxfaW5kaWNlcyxieT1jKCJ2aWRlbyI9InZpZGVvIiwiZmx5X2lkIj0iRmx5SWQiKSkKYGBgCgoKCjxici8+Cjxici8+CgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9Q291cnRzaGlwSW5kZXhXaXRoRmFjaW5nKSkgKyAKICBnZW9tX2JveHBsb3QoKQpgYGAKCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9M30KcDEgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1Db3VydHNoaXBJbmRleCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1Db3VydHNoaXBJbmRleFdpdGhGYWNpbmcpKSArIAogIGdlb21fYm94cGxvdCgpCnAzIDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9VG90YWxDQ0kpKSArIAogIGdlb21fYm94cGxvdCgpCnA0IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9VG90YWxDQ0l3RmFjaW5nKSkgKyAKICBnZW9tX2JveHBsb3QoKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgICMgbGFiZWxzID0gYygiQXBwcm9hY2hpbmdJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIkNvbnRhY3RJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIkVuY2lyY2xpbmdJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIkZhY2luZ0luZGV4IiwKICAgICAgICAgICMgICAgICAgICAgICAiVHVybmluZ0luZGV4IiwKICAgICAgICAgICMgICAgICAgICAgICAiV2luZ0luZGV4IiksCiAgICAgICAgICAjIGhqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSA0LAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKCjxici8+Cjxici8+CgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1BcHByb2FjaGluZ0luZGV4KSkgKyAKICBnZW9tX2JveHBsb3QoKQpwMiA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUNvbnRhY3RJbmRleCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1FbmNpcmNsaW5nSW5kZXgpKSArIAogIGdlb21fYm94cGxvdCgpCnA0IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9RmFjaW5nSW5kZXgpKSArIAogIGdlb21fYm94cGxvdCgpCnA1IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9VHVybmluZ0luZGV4KSkgKyAKICBnZW9tX2JveHBsb3QoKQpwNiA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PVdpbmdJbmRleCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCxwNSxwNiksCiAgICAgICAgICAjIGxhYmVscyA9IGMoIkFwcHJvYWNoaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJDb250YWN0SW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJFbmNpcmNsaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJGYWNpbmdJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIlR1cm5pbmdJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIldpbmdJbmRleCIpLAogICAgICAgICAgIyBoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAyKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NH0KcDEgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1Db3VydHNoaXBJbml0aWF0aW9uKSkgKyAKICBnZW9tX2JveHBsb3QoKQpwMiA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUNvdXJ0c2hpcFRlcm1pbmF0aW9uKSkgKyAKICBnZW9tX2JveHBsb3QoKQpwMyA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUNvdXJ0c2hpcER1cmF0aW9uKSkgKyAKICBnZW9tX2JveHBsb3QoKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKCjxici8+Cjxici8+CgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmRmIDwtIGFsbF9tYWxlX2luZGljZXMgJT4lCiAgc2VsZWN0KGdlbm90eXBlLENvdXJ0c2hpcFRlcm1pbmF0aW9uKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBtdXRhdGUobGVuPWxlbmd0aChDb3VydHNoaXBUZXJtaW5hdGlvbikpCiNnZ3Bsb3QoZGYsYWVzKHg9Q291cnRzaGlwVGVybWluYXRpb24sY29sb3I9Z2Vub3R5cGUpKSArIGdlb21fc3RlcChhZXMobGVuPWxlbix5PS4ueS4uICogbGVuKSxzdGF0PSJlY2RmIikgCmdncGxvdChkZixhZXMoeD1Db3VydHNoaXBUZXJtaW5hdGlvbixjb2xvcj1nZW5vdHlwZSkpICsgZ2VvbV9zdGVwKGFlcyh5PS4ueS4uKSxzdGF0PSJlY2RmIikKYGBgCgoKPGJyLz4KPGJyLz4KCgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KZGYgPC0gYWxsX21hbGVfaW5kaWNlcyAlPiUKICBzZWxlY3QoZ2Vub3R5cGUsQ291cnRzaGlwRHVyYXRpb24pICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIG11dGF0ZShsZW49bGVuZ3RoKENvdXJ0c2hpcER1cmF0aW9uKSkKI2dncGxvdChkZixhZXMoeD1Db3VydHNoaXBEdXJhdGlvbixjb2xvcj1nZW5vdHlwZSkpICsgZ2VvbV9zdGVwKGFlcyhsZW49bGVuLHk9Li55Li4gKiBsZW4pLHN0YXQ9ImVjZGYiKSAKZ2dwbG90KGRmLGFlcyh4PUNvdXJ0c2hpcER1cmF0aW9uLGNvbG9yPWdlbm90eXBlKSkgKyBnZW9tX3N0ZXAoYWVzKHk9Li55Li4pLHN0YXQ9ImVjZGYiKQpgYGAKCgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1BcHByb2FjaGluZ0JvdXRMZW5ndGgpKSArIAogIGdlb21fYm94cGxvdCgpCnAyIDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9Q29udGFjdEJvdXRMZW5ndGgpKSArIAogIGdlb21fYm94cGxvdCgpCnAzIDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9RW5jaXJjbGluZ0JvdXRMZW5ndGgpKSArIAogIGdlb21fYm94cGxvdCgpCnA0IDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9RmFjaW5nQm91dExlbmd0aCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDUgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1UdXJuaW5nQm91dExlbmd0aCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDYgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1XaW5nQm91dExlbmd0aCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDcgPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1BcHByb2FjaGluZ0JvdXRJbnRlcnZhbCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDggPC0gZ2dwbG90KGFsbF9tYWxlX2luZGljZXMsYWVzKHg9Z2Vub3R5cGUseT1Db250YWN0Qm91dEludGVydmFsKSkgKyAKICBnZW9tX2JveHBsb3QoKQpwOSA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUVuY2lyY2xpbmdCb3V0SW50ZXJ2YWwpKSArIAogIGdlb21fYm94cGxvdCgpCnAxMCA8LSBnZ3Bsb3QoYWxsX21hbGVfaW5kaWNlcyxhZXMoeD1nZW5vdHlwZSx5PUZhY2luZ0JvdXRJbnRlcnZhbCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDExIDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9VHVybmluZ0JvdXRJbnRlcnZhbCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKcDEyIDwtIGdncGxvdChhbGxfbWFsZV9pbmRpY2VzLGFlcyh4PWdlbm90eXBlLHk9V2luZ0JvdXRJbnRlcnZhbCkpICsgCiAgZ2VvbV9ib3hwbG90KCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCxwNSxwNiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwNyxwOCxwOSxwMTAscDExLHAxMiksCiAgICAgICAgICAjIGxhYmVscyA9IGMoIkFwcHJvYWNoaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJDb250YWN0SW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJFbmNpcmNsaW5nSW5kZXgiLAogICAgICAgICAgIyAgICAgICAgICAgICJGYWNpbmdJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIlR1cm5pbmdJbmRleCIsCiAgICAgICAgICAjICAgICAgICAgICAgIldpbmdJbmRleCIpLAogICAgICAgICAgIyBoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gNiwKICAgICAgICAgIG5yb3cgPSAyKQpgYGAKCgoKCgoKCgoKCgo8YnIvPgo8YnIvPgo8YnIvPgo8YnIvPgoKCgoKCgoKCgoKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJhd2RhdGFfbGlzdCA8LSBsaXN0LmZpbGVzKCIuLi8iLHJlY3Vyc2l2ZSA9IFRSVUUpICU+JSBzdHJfc3Vic2V0KCJfQUxMREFUQS5jc3YiKSAlPiUgc3RyX3N1YnNldCgiX01hbGVfIikKYWxsX3Jhd2RhdGEgPC0gdGliYmxlKCkKZm9yIChyYXdkYXRhX2ZpbGUgaW4gcmF3ZGF0YV9saXN0KSB7CiAgdGVtcCA8LSByZWFkX2NzdihwYXN0ZTAoIi4uLyIscmF3ZGF0YV9maWxlKSxwcm9ncmVzcyA9IEZBTFNFKQogIGFsbF9yYXdkYXRhIDwtIGJpbmRfcm93cyhhbGxfcmF3ZGF0YSx0ZW1wKQp9CmBgYAoKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUKICBmdWxsX2pvaW4oeCA9IGFsbF9yYXdkYXRhLCB5ID0gZ2Vub3R5cGVzLCBieSA9IGMoIkZpbGVOYW1lIj0idmlkZW8iLCJJZCI9ImZseV9pZCIpKSAlPiUgCiAgcmVwbGFjZV9uYShsaXN0KGdlbm90eXBlID0gIkNTIGZlbWFsZSIpKQphbGxfcmF3ZGF0YQpgYGAKCgoKCgo8YnIvPgo8YnIvPgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihBcmVuYSA9PSAyKSAlPiUgCiAgZmlsdGVyKElkID09IDMpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT13aW5nX2xfYW5nX19yYWQsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9d2luZ19yX2FuZ19fcmFkLCBjb2xvdXIgPSAiIzAwQkZDNCIpKQogIApgYGAKCgo8YnIvPgo8YnIvPgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoQXJlbmEgPT0gMikgJT4lIAogIGZpbHRlcihJZCA9PSAzKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGdncGxvdCgpICsKICAgIGdlb21fZGVuc2l0eShhZXMoeD13aW5nX2xfYW5nX19yYWQsIGNvbG91ciA9ICIjRjg3NjZEIiksc2l6ZSA9IDIpICsKICAgIGdlb21fZGVuc2l0eShhZXMoeD13aW5nX3JfYW5nX19yYWQsIGNvbG91ciA9ICIjMDBCRkM0Iiksc2l6ZSA9IDIpCmBgYAoKCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKEFyZW5hID09IDIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMykgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lIAogIGdncGxvdCgpICsKICAgIGdlb21fZGVuc2l0eShhZXMoeD13aW5nX2xfYW5nX19yYWQsIGNvbG91ciA9ICIjRjg3NjZEIiksc2l6ZSA9IDIpICsKICAgIGdlb21fZGVuc2l0eShhZXMoeD13aW5nX3JfYW5nX19yYWQsIGNvbG91ciA9ICIjMDBCRkM0Iiksc2l6ZSA9IDIpCmBgYAoKCgoKCgoKCmBgYHtyfQojICMgRXh0cmFjdCBkZW5zaXR5IGRhdGEgdG8gYXZlcmFnZQojIHAgPC0gZ2dwbG90X2J1aWxkKHRlc3RfcGxvdCkKIyBnZ3Bsb3QoYXMuZGF0YS5mcmFtZShwJGRhdGFbWzFdXSksIGFlcyh4LHkpKSArIGdlb21fbGluZSgpCiMgZ2dwbG90KGFzLmRhdGEuZnJhbWUocCRkYXRhW1syXV0pLCBhZXMoeCx5KSkgKyBnZW9tX2xpbmUoKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9bWF4X3dpbmdfYW5nX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgoKCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiQiIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PW1heF93aW5nX2FuZ19fcmFkLGNvbG91cj1pbmRpdmlkdWFsKSkgKwogICAgZ2VvbV9kZW5zaXR5KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1tYXhfd2luZ19hbmdfX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1tYXhfd2luZ19hbmdfX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9YW5nbGVfYmV0d2Vlbl9fcmFkKSkgKwogICAgZ2VvbV9wb2ludCgpCmBgYAoKCgoKCjxici8+Cjxici8+CgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoQXJlbmEgPT0gMikgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSx5PWZhY2luZ19hbmdsZV9fcmFkLCBjb2xvcj1hc19mYWN0b3IoSWQpKSkgKwogICAgZ2VvbV9wb2ludCgpCmBgYAoKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoQXJlbmEgPT0gMikgJT4lIAogIGdncGxvdCgpICsKICAgIGdlb21fZGVuc2l0eShhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgY29sb3I9YXNfZmFjdG9yKElkKSksc2l6ZSA9IDIpCmBgYAoKCgoKCjxici8+Cjxici8+CgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDYpCmBgYAoKCjxici8+Cjxici8+CgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsNikKYGBgCgoKCjxici8+Cjxici8+CgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDYpCmBgYAoKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDYpCmBgYAoKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoQXJlbmEgPT0gMikgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSx5PWRpc3RfdG9fb3RoZXJfX21tLCBjb2xvcj1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoKSAKYGBgCgoKPGJyLz4KPGJyLz4KCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDMpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShkaXN0X3RvX290aGVyX19tbT4yLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCgoKCiMjIyBEIGdlbm90eXBlIGRpc3RhbmNlIHRvIG90aGVyCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDI3KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoZGlzdF90b19vdGhlcl9fbW0+Miwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDI5KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoZGlzdF90b19vdGhlcl9fbW0+Miwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShkaXN0X3RvX290aGVyX19tbT4yLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzcpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShkaXN0X3RvX290aGVyX19tbT4yLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCgo8YnIvPgo8YnIvPgoKCgoKCmBgYHtyfQphbGxfcmF3ZGF0YSA8LSBhbGxfcmF3ZGF0YSAlPiUgIAogIHVuaXRlKCJ1bmlxdWVfZmx5IixGaWxlTmFtZSxJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgbXV0YXRlKAogICAgTXVsdGl0YXNraW5nID0gKEFwcHJvYWNoaW5nICsgRW5jaXJjbGluZyArIENvbnRhY3QgKyBUdXJuaW5nICsgV2luZ0dlc3R1cmUpLAogICAgTXVsdGl0YXNraW5nV2l0aEZhY2luZyA9IChBcHByb2FjaGluZyArIEVuY2lyY2xpbmcgKyBGYWNpbmcgKyBDb250YWN0ICsgVHVybmluZyArIFdpbmdHZXN0dXJlKSwKICAgIENvdXJ0c2hpcCA9IGlmZWxzZShNdWx0aXRhc2tpbmc+PTEsIDEsIDApLAogICAgQ291cnRzaGlwV2l0aEZhY2luZyA9IGlmZWxzZShNdWx0aXRhc2tpbmdXaXRoRmFjaW5nPj0xLCAxLCAwKSwKICAgIE11bHRpdGFza2luZ1dpdGhDb3B1bGF0aW9uID0gKEFwcHJvYWNoaW5nICsgRW5jaXJjbGluZyArIENvbnRhY3QgKyBUdXJuaW5nICsgV2luZ0dlc3R1cmUgKyBDb3B1bGF0aW9uKSwKICAgIE11bHRpdGFza2luZ1dpdGhDb3B1bGF0aW9uV2l0aEZhY2luZyA9IChBcHByb2FjaGluZyArIEVuY2lyY2xpbmcgKyBGYWNpbmcgKyBDb250YWN0ICsgVHVybmluZyArIFdpbmdHZXN0dXJlICsgQ29wdWxhdGlvbiksCiAgICBDb3VydHNoaXBBbmRDb3B1bGF0aW9uID0gaWZlbHNlKE11bHRpdGFza2luZ1dpdGhDb3B1bGF0aW9uPj0xLCAxLCAwKSwKICAgIENvdXJ0c2hpcEFuZENvcHVsYXRpb25XdGhGYWNpbmcgPSBpZmVsc2UoTXVsdGl0YXNraW5nV2l0aENvcHVsYXRpb25XaXRoRmFjaW5nPj0xLCAxLCAwKSwKICAgIFNtb290aGVkQ291cnRzaGlwID0gaWZlbHNlKChyb2xsbWVhbihDb3VydHNoaXAsIDE1MCwgZmlsbCA9IGMoMCwwLDApLCBhbGlnbiA9IGMoImxlZnQiKSkpPjAuNSwgMSwgMCksCiAgICBTbW9vdGhlZENvcHVsYXRpb24gPSBpZmVsc2UoKHJvbGxtZWFuKENvcHVsYXRpb24sIDEyNTAsIGZpbGwgPSBjKDAsMCwwKSwgYWxpZ24gPSBjKCJjZW50ZXIiKSkpPjAuNSwgMSwgMCksCiAgICBTbW9vdGhlZERpc3RUb090aGVyID0gaWZlbHNlKChyb2xsbWVhbihpZmVsc2UoZGlzdF90b19vdGhlcl9fbW0gPiAyLCAxLCAwKSwgMjUwLCBmaWxsID0gYygxLDEsTkEpLCBhbGlnbiA9IGMoImNlbnRlciIpKSk+MC41LCAxLCAwKQopCmBgYAoKCgoKCgo8YnIvPgo8YnIvPgoKCgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM3KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWREaXN0VG9PdGhlcj09MSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCjxici8+Cjxici8+CgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzcpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PVNtb290aGVkRGlzdFRvT3RoZXIsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpCiAgICAKYGBgCgoKCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM1KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWREaXN0VG9PdGhlcj09MSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PVNtb290aGVkRGlzdFRvT3RoZXIsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpCiAgICAKYGBgCgoKCgo8YnIvPgo8YnIvPgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PVNtb290aGVkRGlzdFRvT3RoZXIsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpICsKICAgIHhsaW0oMjAwMCwzMDAwKQpgYGAKCgo8YnIvPgo8YnIvPgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBzdW1tYXJpc2Uod2hpY2gubWluKFNtb290aGVkRGlzdFRvT3RoZXIpLAogICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSkKYGBgCgoKCgoKCgoKPGJyLz4KPGJyLz4KCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWREaXN0VG9PdGhlcj09MSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWRDb3B1bGF0aW9uPT0wLCJub3QgY29wdWxhdGluZyIsImNvcHVsYXRpbmciKSkpKQpgYGAKCgoKCjxici8+Cjxici8+CgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMykgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9U21vb3RoZWREaXN0VG9PdGhlciwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0oU21vb3RoZWRDb3B1bGF0aW9uKzAuMSksIGNvbG91cj0gIiMwMEJGQzQiKSkgKwogICAgeGxpbSg2MDAwLDcwMDApCmBgYAoKCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzKSAlPiUgCiAgc3VtbWFyaXNlKHdoaWNoLm1pbihTbW9vdGhlZERpc3RUb090aGVyKSwKICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikpCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgoKCgojIyMgRCBnZW5vdHlwZSBkaXN0YW5jZSB0byBvdGhlcgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAyNykgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSx5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3VyPWMoaWZlbHNlKFNtb290aGVkRGlzdFRvT3RoZXI9PTEsIm5vdCBjb3B1bGF0aW5nIiwiY29wdWxhdGluZyIpKSkpCmBgYAoKCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAyOSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSx5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3VyPWMoaWZlbHNlKFNtb290aGVkRGlzdFRvT3RoZXI9PTEsIm5vdCBjb3B1bGF0aW5nIiwiY29wdWxhdGluZyIpKSkpCmBgYAoKCjxici8+Cjxici8+CgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzUpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUseT1kaXN0X3RvX290aGVyX19tbSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG91cj1jKGlmZWxzZShTbW9vdGhlZERpc3RUb090aGVyPjAuNSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM3KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWREaXN0VG9PdGhlcj09MSwibm90IGNvcHVsYXRpbmciLCJjb3B1bGF0aW5nIikpKSkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgoKCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1tYXhfd2luZ19hbmdfX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsNikgKwogICAgeGxpbSgwLHBpKQpgYGAKCgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWFuZ2xlX2JldHdlZW5fX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsMykgKwogICAgeGxpbSgwLHBpKQpgYGAKCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWFuZ2xlX2JldHdlZW5fX3JhZCxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsMykgKwogICAgeGxpbSgwLHBpKQpgYGAKCgoKCjxici8+Cjxici8+CgoKCgoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWRpc3RfdG9fd2FsbF9fbW0sY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDIuMikgKwogICAgeGxpbSgwLDEwKQpgYGAKCgoKCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZGlzdF90b193YWxsX19tbSxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsMi4yKSArCiAgICB4bGltKDAsMTApCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8YnIvPgo8YnIvPgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZGlzdF90b19vdGhlcl9fbW0sY29sb3VyPWluZGl2aWR1YWwpKSArCiAgICBnZW9tX2RlbnNpdHkoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgeWxpbSgwLDIpICsKICAgIHhsaW0oMCwyMCkKYGBgCgoKCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1kaXN0X3RvX290aGVyX19tbSxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsMikgKwogICAgeGxpbSgwLDIwKQpgYGAKCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1kaXN0X3RvX290aGVyX19tbSxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsMikgKwogICAgeGxpbSgwLDIwKQpgYGAKCgoKCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1kaXN0X3RvX290aGVyX19tbSxjb2xvdXI9aW5kaXZpZHVhbCkpICsKICAgIGdlb21fZGVuc2l0eSgpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICB5bGltKDAsMikgKwogICAgeGxpbSgwLDIwKQpgYGAKCgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2Rpc3RfdG9fb3RoZXIgPSBtZWFuKGRpc3RfdG9fb3RoZXJfX21tKSkKCgpgYGAKCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCgojIyMgKiptZWFuIGRpc3RhbmNlIHRvIG90aGVyKioKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD00fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9kaXN0X3RvX290aGVyID0gbWVhbihkaXN0X3RvX290aGVyX19tbSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2Rpc3RfdG9fb3RoZXIpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMTApCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGlzdF90b19vdGhlciA9IG1lYW4oZGlzdF90b19vdGhlcl9fbW0pLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVhbl9kaXN0X3RvX290aGVyKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEwKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkIDwgKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2Rpc3RfdG9fb3RoZXIgPSBtZWFuKGRpc3RfdG9fb3RoZXJfX21tKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZGlzdF90b19vdGhlcikpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCwxMCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBbGwgRnJhbWVzIiwiV2luZyBFeHRlbnNpb24gRnJhbWVzIiwiTm9uLVdpbmcgRXh0ZW5zaW9uIEZyYW1lcyIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCiMjIyAqKm1lZGlhbiBkaXN0YW5jZSB0byBvdGhlcioqCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lZGlhbl9kaXN0X3RvX290aGVyID0gbWVkaWFuKGRpc3RfdG9fb3RoZXJfX21tKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9kaXN0X3RvX290aGVyKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEwKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZGlzdF90b19vdGhlciA9IG1lZGlhbihkaXN0X3RvX290aGVyX19tbSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZGlzdF90b19vdGhlcikpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCwxMCkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2Rpc3RfdG9fb3RoZXIgPSBtZWRpYW4oZGlzdF90b19vdGhlcl9fbW0pLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVkaWFuX2Rpc3RfdG9fb3RoZXIpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMTApCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygiQWxsIEZyYW1lcyIsIldpbmcgRXh0ZW5zaW9uIEZyYW1lcyIsIk5vbi1XaW5nIEV4dGVuc2lvbiBGcmFtZXMiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgoKCiMjIyAqKm1lYW4gZmFjaW5nIGFuZ2xlKiogCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2ZhY2luZ19hbmdsZSA9IG1lYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaSkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIGxhYmVscyA9IGMoIkFsbCBGcmFtZXMiLCJXaW5nIEV4dGVuc2lvbiBGcmFtZXMiLCJOb24tV2luZyBFeHRlbnNpb24gRnJhbWVzIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCgoKCgoKCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCgoKIyMjICoqbWVkaWFuIGZhY2luZyBhbmdsZSoqCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD00fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lZGlhbl9mYWNpbmdfYW5nbGUgPSBtZWRpYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVkaWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaSkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBbGwgRnJhbWVzIiwiV2luZyBFeHRlbnNpb24gRnJhbWVzIiwiTm9uLVdpbmcgRXh0ZW5zaW9uIEZyYW1lcyIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMS41KQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMSkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDIpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygiQWxsIEZyYW1lcyIsIldpbmcgRXh0ZW5zaW9uIEZyYW1lcyIsIk5vbi1XaW5nIEV4dGVuc2lvbiBGcmFtZXMiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCjxici8+Cjxici8+CgoKCmBgYHtyfQp0ZXN0X3N0YXRfdGliYmxlMCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkKYGBgCgpgYGB7cn0KYW92MCA8LSBhb3YobWVkaWFuX2ZhY2luZ19hbmdsZX5nZW5vdHlwZSxkYXRhID0gdGVzdF9zdGF0X3RpYmJsZTApCnN1bW1hcnkoYW92MCkKYGBgCgpgYGB7cn0KVHVrZXlIU0QoYW92MCkKYGBgCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgoKIyMjICoqbWVkaWFuIGZhY2luZyBhbmdsZSBieSBzZWN0b3IqKgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDwgcGkvNikgJT4lIAogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lZGlhbl9mYWNpbmdfYW5nbGUgPSBtZWRpYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVkaWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaS82KQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDwgcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVkaWFuX2ZhY2luZ19hbmdsZSA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWRpYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpLzYpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPCBwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkIDwgKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkvNikKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzYpICU+JSAKICAjZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkpCnA1IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkpCnA2IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkIDwgKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWRpYW5fZmFjaW5nX2FuZ2xlID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lZGlhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQscDUscDYpLAogICAgICAgICAgbGFiZWxzID0gYygiQWxsIEZyYW1lcyIsIldpbmcgRXh0ZW5zaW9uIEZyYW1lcyIsIk5vbi1XaW5nIEV4dGVuc2lvbiBGcmFtZXMiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAyKQoKYGBgCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgojIyMgKiptZWFuIGZhY2luZyBhbmdsZSBieSBzZWN0b3IqKgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPCBwaS82KSAlPiUgCiAgI2ZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLHBpLzYpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPCBwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2ZhY2luZ19hbmdsZSA9IG1lYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAscGkvNikKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8IHBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaS82KQpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gcGkvNikgJT4lIAogICNmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaSkKcDUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaSkKcDYgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCxwaSkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCxwNSxwNiksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBbGwgRnJhbWVzIiwiV2luZyBFeHRlbnNpb24gRnJhbWVzIiwiTm9uLVdpbmcgRXh0ZW5zaW9uIEZyYW1lcyIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgoKIyMjICoqbWVhbiBmYWNpbmcgYW5nbGUgYnkgd2VlIHNlY3RvcnMqKgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiAwKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS82KSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IDIqcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IDIqcGkvNikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSAzKnBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiAzKnBpLzYpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gNCpwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2ZhY2luZ19hbmdsZSA9IG1lYW4oZmFjaW5nX2FuZ2xlX19yYWQpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9bWVhbl9mYWNpbmdfYW5nbGUpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaSkKcDUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IDQqcGkvNikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSA1KnBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZmFjaW5nX2FuZ2xlID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1tZWFuX2ZhY2luZ19hbmdsZSkpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpKQpwNiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gNSpwaS82KSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IDYqcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA8ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UobWVhbl9mYWNpbmdfYW5nbGUgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PW1lYW5fZmFjaW5nX2FuZ2xlKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQscDUscDYpLAogICAgICAgICAgbGFiZWxzID0gYygiMC1waS82IiwicGkvNi0ycGkvNiIsIjJwaS82LTNwaS82IiwKICAgICAgICAgICAgICAgICAgICAgIjNwaS82LTRwaS82IiwiNHBpLzYtNXBpLzYiLCI1cGkvNi02cGkvNiIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgoKCgoKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCgoKCiMjIyAqKmNvdW50cyBpbiB3ZWUgc2VjdG9ycyoqCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IDApICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS82KSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IDIqcGkvNikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiAyKnBpLzYpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gMypwaS82KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkIDwgKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IDMqcGkvNikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSA0KnBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IGxlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaSkKcDUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IDQqcGkvNikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSA1KnBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IGxlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaSkKcDYgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IDUqcGkvNikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSA2KnBpLzYpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPCAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IGxlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaSkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCxwNSxwNiksCiAgICAgICAgICBsYWJlbHMgPSBjKCIwLXBpLzYiLCJwaS82LTJwaS82IiwiMnBpLzYtM3BpLzYiLAogICAgICAgICAgICAgICAgICAgICAiM3BpLzYtNHBpLzYiLCI0cGkvNi01cGkvNiIsIjVwaS82LTZwaS82IiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgojIyMjICoqVG90YWwgdGltZSBpbiBzZWN0b3IqKgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkID4gMCkgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSBwaS84KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzgpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IGxlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoIjxwaS84IiwiPnBpLzgiKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCiMjIyMgKipQcm9wb3J0aW9uIHRpbWUgaW4gc2VjdG9yKioKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSAxMDAqc3VtKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzgpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSAxMDAqc3VtKGZhY2luZ19hbmdsZV9fcmFkID4gcGkvOCkvbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIpLAogICAgICAgICAgbGFiZWxzID0gYygiPHBpLzgiLCI+cGkvOCIpLAogICAgICAgICAgaGp1c3QgPSAtMS40LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCjxici8+Cjxici8+CgoKYGBge3J9CnRlc3Rfc3RhdF90aWJibGUwIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gMTAwKnN1bShmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzgpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkKYW92MCA8LSBhb3YoY291bnRzfmdlbm90eXBlLGRhdGEgPSB0ZXN0X3N0YXRfdGliYmxlMCkKI3N1bW1hcnkoYW92MCkKVHVrZXlIU0QoYW92MCkKYGBgCgoKCjxici8+Cjxici8+CgoKCmBgYHtyfQpwYWlyd2lzZS50LnRlc3QodGVzdF9zdGF0X3RpYmJsZTAkY291bnRzLCB0ZXN0X3N0YXRfdGliYmxlMCRnZW5vdHlwZSkKYGBgCgoKCgoKCgoKCgoKCgo8YnIvPgo8YnIvPgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDIsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgY29vcmRfcG9sYXIoKSArCiAgdGhlbWVfdm9pZCgpCgpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDIwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMiwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICBjb29yZF9wb2xhcigpICsKICB0aGVtZV92b2lkKCkKCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQyIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMjApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIGNvb3JkX3BvbGFyKCkgKwogIHRoZW1lX3ZvaWQoKQoKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwyMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDIsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgY29vcmRfcG9sYXIoKSArCiAgdGhlbWVfdm9pZCgpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCJCIiwiQyIsIkQiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAyKQoKYGBgCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCiMjIyMgVG90YWwgdGltZSBpbiBzZWN0b3IKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiAwKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzgpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IGxlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS84KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSBsZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMiksCiAgICAgICAgICBsYWJlbHMgPSBjKCI8cGkvOCIsIj5waS84IiksCiAgICAgICAgICBoanVzdCA9IC0wLjYsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgojIyMjIFByb3BvcnRpb24gdGltZSBpbiBzZWN0b3IgYW5kIHdpdGhpbiAxMG1tCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSAxMDAqc3VtKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzgpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgdW5pdGUoImluZGl2aWR1YWwiLCBGaWxlTmFtZTpJZCwgcmVtb3ZlID0gRkFMU0UpICU+JSAKICBncm91cF9ieShpbmRpdmlkdWFsKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50cyA9IDEwMCpzdW0oZmFjaW5nX2FuZ2xlX19yYWQgPiBwaS84KS9sZW5ndGgoRnJhbWUpLAogICAgICAgICAgICBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9Y291bnRzKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgIysKICAgICN5bGltKDAscGkvNikKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMiksCiAgICAgICAgICBsYWJlbHMgPSBjKCI8cGkvOCIsIj5waS84IiksCiAgICAgICAgICBoanVzdCA9IC0xLjQsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyfQp0ZXN0X3N0YXRfdGliYmxlMCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gMTAwKnN1bShmYWNpbmdfYW5nbGVfX3JhZCA+IHBpLzgpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkKYW92MCA8LSBhb3YoY291bnRzfmdlbm90eXBlLGRhdGEgPSB0ZXN0X3N0YXRfdGliYmxlMCkKI3N1bW1hcnkoYW92MCkKVHVrZXlIU0QoYW92MCkKYGBgCgo8YnIvPgo8YnIvPgoKCmBgYHtyfQpwYWlyd2lzZS50LnRlc3QodGVzdF9zdGF0X3RpYmJsZTAkY291bnRzLCB0ZXN0X3N0YXRfdGliYmxlMCRnZW5vdHlwZSkKYGBgCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJDIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIsIkMiLCJEIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDQsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQiIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYyg0LDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoNCwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDQsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCJCIiwiQyIsIkQiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAyKQoKYGBgCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYyg0MCwxMCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDUwLDUwMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJCIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDQwLDEwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoNTAsNTAwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoNDAsMTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYyg1MCw1MDAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYyg0MCwxMCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDUwLDUwMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiLCJDIiwiRCIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgoKCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyfQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQSIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxMDAsMjUpKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygxMCwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJCIikgJT4lIAogIGdncGxvdChhZXMoeD1mYWNpbmdfYW5nbGVfX3JhZCwgeT1kaXN0X3RvX290aGVyX19tbSkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDEwMCwyNSkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCwxMCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDEwLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMTAwLDI1KSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDEwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMTAsMjAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwNCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9ZmFjaW5nX2FuZ2xlX19yYWQsIHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygxMDAsMjUpKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsMTApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygxMCwyMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiLCJDIiwiRCIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCgpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgo8YnIvPgo8YnIvPgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGNvbG91cj0id2hpdGUiKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNikgKyAKICAjc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX2dyZXkoKSArCiAgY29vcmRfcG9sYXIoKQogIAoKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGNvbG91cj0id2hpdGUiKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNikgKyAKICAjc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX2dyZXkoKSArCiAgY29vcmRfcG9sYXIoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGNvbG91cj0id2hpdGUiKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNikgKyAKICAjc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX2dyZXkoKSArCiAgY29vcmRfcG9sYXIoKQoKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWZhY2luZ19hbmdsZV9fcmFkLCB5PWRpc3RfdG9fb3RoZXJfX21tKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGNvbG91cj0id2hpdGUiKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNikgKyAKICAjc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygyLDIwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX2dyZXkoKSArCiAgY29vcmRfcG9sYXIoKQoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIsIkMiLCJEIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgojIyMjIFRvdGFsIGNvdW50IGluIGlubmVyIHJpbmcKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gcGkvOCkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPD0gMykgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSBwaS84KSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMykgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8PSAxMCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIpLAogICAgICAgICAgbGFiZWxzID0gYygiMm1tLTNtbSIsIjNtbS0xMG1tIiksCiAgICAgICAgICBoanVzdCA9IC0wLjYsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgojIyMjIFByb3BvcnRpb24gY291bnQgaW4gaW5uZXIgcmluZwoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGZpbHRlcihmYWNpbmdfYW5nbGVfX3JhZCA8PSBwaS84KSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDI1KnBpLzE4MCkpICU+JQogIHVuaXRlKCJpbmRpdmlkdWFsIiwgRmlsZU5hbWU6SWQsIHJlbW92ZSA9IEZBTFNFKSAlPiUgCiAgZ3JvdXBfYnkoaW5kaXZpZHVhbCkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSAxMDAqc3VtKGRpc3RfdG9fb3RoZXJfX21tID4gMiAmIGRpc3RfdG9fb3RoZXJfX21tIDw9IDMpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSwgeT1jb3VudHMpKSArCiAgICBnZW9tX2JveHBsb3QoKSAjKwogICAgI3lsaW0oMCxwaS82KQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBmaWx0ZXIoZmFjaW5nX2FuZ2xlX19yYWQgPD0gcGkvOCkgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgyNSpwaS8xODApKSAlPiUKICB1bml0ZSgiaW5kaXZpZHVhbCIsIEZpbGVOYW1lOklkLCByZW1vdmUgPSBGQUxTRSkgJT4lIAogIGdyb3VwX2J5KGluZGl2aWR1YWwpICU+JSAKICBzdW1tYXJpc2UoY291bnRzID0gMTAwKnN1bShkaXN0X3RvX290aGVyX19tbSA+IDMgJiBkaXN0X3RvX290aGVyX19tbSA8PSAxMCkvbGVuZ3RoKEZyYW1lKSwKICAgICAgICAgICAgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLCB5PWNvdW50cykpICsKICAgIGdlb21fYm94cGxvdCgpICMrCiAgICAjeWxpbSgwLHBpLzYpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIpLAogICAgICAgICAgbGFiZWxzID0gYygiMm1tLTNtbSIsIjNtbS0xMG1tIiksCiAgICAgICAgICBoanVzdCA9IC0wLjYsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgo8YnIvPgo8YnIvPgoKCmBgYHtyfQp0ZXN0X3N0YXRfdGliYmxlMCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZmlsdGVyKGZhY2luZ19hbmdsZV9fcmFkIDw9IHBpLzgpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShjb3VudHMgPSAxMDAqc3VtKGRpc3RfdG9fb3RoZXJfX21tID4gMiAmIGRpc3RfdG9fb3RoZXJfX21tIDw9IDMpL2xlbmd0aChGcmFtZSksCiAgICAgICAgICAgIGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSkKYW92MCA8LSBhb3YoY291bnRzfmdlbm90eXBlLGRhdGEgPSB0ZXN0X3N0YXRfdGliYmxlMCkKI3N1bW1hcnkoYW92MCkKVHVrZXlIU0QoYW92MCkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCgojIExlZnQgdnMgUmlnaHQgd2luZwoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHdpbmdfaW5kZXggPSAxMDAqc3VtKFdpbmdHZXN0dXJlW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShtYXhfd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPigzNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoIkpBQUJBIiwid2luZyBhbmdsZSIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgV2luZ19pbmRleF9ieV9KQUFCQSA9IDEwMCpzdW0oV2luZ0dlc3R1cmVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIFdpbmdfaW5kZXhfYnlfYW5nbGUgPSAxMDAqc3VtKG1heF93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDM1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PVdpbmdfaW5kZXhfYnlfYW5nbGUseT1XaW5nX2luZGV4X2J5X0pBQUJBLGNvbG91cj1nZW5vdHlwZSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0pICsKICAgIHN0YXRfY29yKGxhYmVsLnkgPSBjKDUyLDU2LDYwLDY0KSwgc2l6ZSA9NSkgKwogICAgc3RhdF9yZWdsaW5lX2VxdWF0aW9uKGxhYmVsLnkgPSBjKDUwLDU0LDU4LDYyKSwgc2l6ZSA9NSkgKwogICAgY29vcmRfZml4ZWQoKQpgYGAKCgoKCgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTB9CndpbmQgPC0gNjAwCnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShtYXhfd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oMzUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgbGVmdF93aW5nX2luZGV4ID0gMTAwKnN1bSh3aW5nX2xfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF08KC0zNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1sZWZ0X3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgcmlnaHRfd2luZ19pbmRleCA9IDEwMCpzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPigzNSpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1yaWdodF93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGJvdGhfd2luZ19pbmRleCA9IDEwMCpzdW0obWluX3dpbmdfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDM1KnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWJvdGhfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDQscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygiZWl0aGVyIHdpbmciLCJib3RoIHdpbmdzIiwibGVmdCB3aW5nIiwicmlnaHQgd2luZyIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKYGBgCgoKPGJyLz4KPGJyLz4KCgoKYGBge3J9CnRlc3Rfc3RhdF90aWJibGUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogICNmaWx0ZXIoZ2Vub3R5cGUgIT0gIkEiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgYm90aF93aW5nX2luZGV4ID0gMTAwKnN1bShtaW5fd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oMzUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkKYW92MSA8LSBhb3YoYm90aF93aW5nX2luZGV4fmdlbm90eXBlLCBkYXRhID0gdGVzdF9zdGF0X3RpYmJsZSkKVHVrZXlIU0QoYW92MSkKYGBgCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0Kd2luZCA8LSA2MDAKcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGJvdGhfd2luZ19pbmRleCA9IDEwMCpzdW0obWluX3dpbmdfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDEwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1ib3RoX3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMiA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgYm90aF93aW5nX2luZGV4ID0gMTAwKnN1bShtaW5fd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oMjAqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9Ym90aF93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIGJvdGhfd2luZ19pbmRleCA9IDEwMCpzdW0obWluX3dpbmdfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDMwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWJvdGhfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBib3RoX3dpbmdfaW5kZXggPSAxMDAqc3VtKG1pbl93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPig0MCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1ib3RoX3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIj4xMGRlZyIsIj4yMGRlZyIsIj4zMGRlZyIsIj40MGRlZyIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDQsCiAgICAgICAgICBucm93ID0gMSkKYGBgCgoKPGJyLz4KPGJyLz4KCgoKYGBge3J9CnRlc3Rfc3RhdF90aWJibGUgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogICNmaWx0ZXIoZ2Vub3R5cGUgIT0gIkEiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgYm90aF93aW5nX2luZGV4ID0gMTAwKnN1bShtaW5fd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oMTUqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkKYW92MSA8LSBhb3YoYm90aF93aW5nX2luZGV4fmdlbm90eXBlLCBkYXRhID0gdGVzdF9zdGF0X3RpYmJsZSkKVHVrZXlIU0QoYW92MSkKYGBgCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CndpbmQgPC0gNjAwCnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBtZWFuX21heF93aW5nID0gbWVhbihtYXhfd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9bWVhbl9tYXhfd2luZykpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCwxLjUpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBtZWFuX2xlZnRfd2luZyA9IC1tZWFuKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxuYS5ybSA9IFRSVUUpCiAgICAgICAgICAgICkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9bWVhbl9sZWZ0X3dpbmcpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMS41KQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgbWVhbl9yaWdodF93aW5nID0gbWVhbih3aW5nX3JfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sbmEucm0gPSBUUlVFKQogICAgICAgICAgICApICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PW1lYW5fcmlnaHRfd2luZykpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCwxLjUpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBtZWFuX21pbl93aW5nID0gbWVhbihtaW5fd2luZ19hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1tZWFuX21pbl93aW5nKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEuNSkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwNCxwMixwMyksCiAgICAgICAgICBsYWJlbHMgPSBjKCJtYXggd2luZyIsIm1pbiB3aW5ncyIsImxlZnQgd2luZyIsInJpZ2h0IHdpbmciKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSA0LAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKCgoKCgo8YnIvPgo8YnIvPgoKCgpgYGB7cn0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIG1lYW5fbWluX3dpbmcgPSBtZWFuKG1pbl93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PW1lYW5fbWluX3dpbmcpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsLjUpCmBgYAoKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3J9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBtaW5fd2luZ19ndF8xNSA9IHN1bShtZWFuKG1pbl93aW5nX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKT4xNSpwaS8xODApCiAgICAgICAgICAgICkgJT4lIAogIHN1bW1hcmlzZShwcm9wX21pbl93aW5nX2d0XzE1ID0gMTAwKnN1bShtaW5fd2luZ19ndF8xNT4wLG5hLnJtID0gVFJVRSkvbGVuZ3RoKG1pbl93aW5nX2d0XzE1KSkKYGBgCgoKCgoKCgoKCgoKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PS13aW5nX2xfYW5nX19yYWQsIHk9d2luZ19sX2xlbl9fcHgpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNDApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PS13aW5nX2xfYW5nX19yYWQsIHk9d2luZ19sX2xlbl9fcHgpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNDApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PS13aW5nX2xfYW5nX19yYWQsIHk9d2luZ19sX2xlbl9fcHgpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNDApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PS13aW5nX2xfYW5nX19yYWQsIHk9d2luZ19sX2xlbl9fcHgpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNDApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIsIkMiLCJEIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGdncGxvdChhZXMoeD13aW5nX3JfYW5nX19yYWQsIHk9d2luZ19yX2xlbl9fcHgpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNDApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXdpbmdfcl9hbmdfX3JhZCwgeT13aW5nX3JfbGVuX19weCkpICsKICBnZW9tX2JpbjJkKGJpbnMgPSBjKDIwMCw1MCkpICsKICB4bGltKDAsMipwaSkgKwogIHlsaW0oMCw0MCkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA8IDEwKSAlPiUgCiAgZmlsdGVyKG1pbl93aW5nX2FuZ19fcmFkID4gKDE1KnBpLzE4MCkpICU+JQogIGZpbHRlcihnZW5vdHlwZSA9PSAiQyIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4KSkgKwogIGdlb21fYmluMmQoYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oMCwyKnBpKSArCiAgeWxpbSgwLDQwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGdncGxvdChhZXMoeD13aW5nX3JfYW5nX19yYWQsIHk9d2luZ19yX2xlbl9fcHgpKSArCiAgZ2VvbV9iaW4yZChiaW5zID0gYygyMDAsNTApKSArCiAgeGxpbSgwLDIqcGkpICsKICB5bGltKDAsNDApICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIsbGltaXRzID0gYygwLDEwMDApLG5hLnZhbHVlID0gIndoaXRlIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgY29vcmRfcG9sYXIoKQoKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyxwNCksCiAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwiQiIsIkMiLCJEIiksCiAgICAgICAgICAjaGp1c3QgPSAxLAogICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICBucm93ID0gMikKCmBgYAoKCgoKCgoKCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkEiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4KSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIGdlb21fYmluMmQoYWVzKHg9d2luZ19sX2FuZ19fcmFkLCB5PXdpbmdfbF9sZW5fX3B4KSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkIiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4KSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIGdlb21fYmluMmQoYWVzKHg9d2luZ19sX2FuZ19fcmFkLCB5PXdpbmdfbF9sZW5fX3B4KSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkMiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4KSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIGdlb21fYmluMmQoYWVzKHg9d2luZ19sX2FuZ19fcmFkLCB5PXdpbmdfbF9sZW5fX3B4KSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKcDQgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPCAxMCkgJT4lIAogIGZpbHRlcihtaW5fd2luZ19hbmdfX3JhZCA+ICgxNSpwaS8xODApKSAlPiUKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fYmluMmQoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4KSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIGdlb21fYmluMmQoYWVzKHg9d2luZ19sX2FuZ19fcmFkLCB5PXdpbmdfbF9sZW5fX3B4KSwgYmlucyA9IGMoMjAwLDUwKSkgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiLGxpbWl0cyA9IGMoMCwxMDAwKSxuYS52YWx1ZSA9ICJ3aGl0ZSIpICsKICB0aGVtZV92b2lkKCkgKwogIGNvb3JkX3BvbGFyKCkKCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygiQSIsIkIiLCJDIiwiRCIpLAogICAgICAgICAgI2hqdXN0ID0gMSwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDIpCmBgYAoKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTJ9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJBIikgJT4lIAogIGdncGxvdCgpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4LGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgc3RhdF9kZW5zaXR5XzJkKGFlcyh4PXdpbmdfbF9hbmdfX3JhZCwgeT13aW5nX2xfbGVuX19weCxmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbSA9ICJwb2x5Z29uIikgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogICNzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJCIikgJT4lIAogIGdncGxvdCgpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4LGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgc3RhdF9kZW5zaXR5XzJkKGFlcyh4PXdpbmdfbF9hbmdfX3JhZCwgeT13aW5nX2xfbGVuX19weCxmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbSA9ICJwb2x5Z29uIikgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogICNzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJDIikgJT4lIAogIGdncGxvdCgpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4LGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgc3RhdF9kZW5zaXR5XzJkKGFlcyh4PXdpbmdfbF9hbmdfX3JhZCwgeT13aW5nX2xfbGVuX19weCxmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbSA9ICJwb2x5Z29uIikgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogICNzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCnA0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWluX3dpbmdfYW5nX19yYWQgPiAoMTUqcGkvMTgwKSkgJT4lCiAgZmlsdGVyKGdlbm90eXBlID09ICJEIikgJT4lIAogIGdncGxvdCgpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKHg9d2luZ19yX2FuZ19fcmFkLCB5PXdpbmdfcl9sZW5fX3B4LGZpbGwgPSAuLmxldmVsLi4pLCBnZW9tID0gInBvbHlnb24iKSArCiAgc3RhdF9kZW5zaXR5XzJkKGFlcyh4PXdpbmdfbF9hbmdfX3JhZCwgeT13aW5nX2xfbGVuX19weCxmaWxsID0gLi5sZXZlbC4uKSwgZ2VvbSA9ICJwb2x5Z29uIikgKwogIHhsaW0oLXBpLHBpKSArCiAgeWxpbSgwLDYwKSArIAogICNzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIixsaW1pdHMgPSBjKDAsMTAwMCksbmEudmFsdWUgPSAid2hpdGUiKSArCiAgdGhlbWVfdm9pZCgpICsKICBjb29yZF9wb2xhcigpCgpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzLHA0KSwKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCJCIiwiQyIsIkQiKSwKICAgICAgICAgICNoanVzdCA9IDEsCiAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgIG5yb3cgPSAyKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCgoKCgoKYGBge3J9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tIDwgMTApICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMjUqcGkvMTgwKSkgJT4lCiAgI2ZpbHRlcihnZW5vdHlwZSA9PSAiRCIpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUsIHk9d2luZ19sX2xlbl9fcHgpKSsKICBnZW9tX2JveHBsb3QoKQpgYGAKCgoKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgojICoqRmFjaW5nIGFuZ2xlIGF0IHN0YXJ0IHZzIGVuZCBvZiB3aW5nIGJvdXQqKgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM2KSAlPiUKICBzbGljZSh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOndoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0td2luZ19sX2FuZ19fcmFkLCBjb2xvdXIgPSAiI0Y4NzY2RCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PXdpbmdfcl9hbmdfX3JhZCwgY29sb3VyID0gIiMwMEJGQzQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShtYXhfd2luZ19hbmdfX3JhZD49KDI1KnBpLzE4MCksMS42LC0xKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKFdpbmdHZXN0dXJlPT0xLFdpbmdHZXN0dXJlKzAuOCxXaW5nR2VzdHVyZS0xKSkpKSArCiAgICAjZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShXaW5nR2VzdHVyZT09MSxXaW5nR2VzdHVyZSswLjYsV2luZ0dlc3R1cmUtMSkpKSkgKwogIHlsaW0oMCwyKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfNiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gNykgJT4lCiAgc2xpY2Uod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0td2luZ19sX2FuZ19fcmFkLCBjb2xvdXIgPSAiI0Y4NzY2RCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PXdpbmdfcl9hbmdfX3JhZCwgY29sb3VyID0gIiMwMEJGQzQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShtYXhfd2luZ19hbmdfX3JhZD49KDM1KnBpLzE4MCksMS42LC0xKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKFdpbmdHZXN0dXJlPT0xLFdpbmdHZXN0dXJlKzAuOCxXaW5nR2VzdHVyZS0xKSkpKSArCiAgICAjZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShXaW5nR2VzdHVyZT09MSxXaW5nR2VzdHVyZSswLjYsV2luZ0dlc3R1cmUtMSkpKSkgKwogIHlsaW0oMCwyKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDUpICU+JQogIHNsaWNlKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICU+JQogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9LXdpbmdfbF9hbmdfX3JhZCwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT13aW5nX3JfYW5nX19yYWQsIGNvbG91ciA9ICIjMDBCRkM0IikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UobWF4X3dpbmdfYW5nX19yYWQ+PSgzNSpwaS8xODApLDEuNiwtMSkpKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShXaW5nR2VzdHVyZT09MSxXaW5nR2VzdHVyZSswLjgsV2luZ0dlc3R1cmUtMSkpKSkgKwogICAgI2dlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoV2luZ0dlc3R1cmU9PTEsV2luZ0dlc3R1cmUrMC42LFdpbmdHZXN0dXJlLTEpKSkpICsKICB5bGltKDAsMikKYGBgCgoKCgoKCgoKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCgoKCgojIyMgKipGYWNpbmcgYW5nbGUgYXQgc3RhcnQgYW5kIGVuZCBvZiBlYWNoIGJvdXQqKgoKCgoKYGBge3J9CnRlbXAgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKQogIAp1bmlxX2ZseSA8LSB1bmlxdWUodGVtcCR1bmlxdWVfZmx5KQpmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nIDwtIHRpYmJsZSgpCmZvciAoZmx5IGluIHVuaXFfZmx5KSB7CiAgdGVtcDIgPC0gZmlsdGVyKHRlbXAsIHVuaXF1ZV9mbHkgPT0gZmx5KQogIGJvdXRzIDwtIHJsZSh0ZW1wMiRXaW5nR2VzdHVyZSkKICAKICBzdGFydHMgPC0gYXMubnVtZXJpYygpCiAgZm9yIChpIGluIHNlcSgxLGxlbmd0aCh3aGljaChib3V0cyR2YWx1ZXM9PTEpKSwxKSkgewogICAgc3RhcnRzW2ldID0gc3VtKGJvdXRzJGxlbmd0aHNbMTooaSoyKS0xXSkrMQogIH0KICBlbmRzIDwtIGFzLm51bWVyaWMoKQogIGZvciAoaSBpbiBzZXEoMSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSksMSkpIHsKICAgIGVuZHNbaV0gPSBzdW0oYm91dHMkbGVuZ3Roc1sxOihpKjIpXSkKICB9CiAgZ2Vub3R5cGUgPSByZXAodW5pcXVlKHRlbXAyJGdlbm90eXBlKSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSkpCiAgdW5pX2lkID0gcmVwKHVuaXF1ZSh0ZW1wMiR1bmlxdWVfZmx5KSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSkpCiAgCiAgdGVtcF90aWJibGUgPC0gdGliYmxlKHVuaXF1ZV9mbHkgPSB1bmlfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGdlbm90eXBlID0gZ2Vub3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZ19hdF9zdGFydCA9IHRlbXAyJGZhY2luZ19hbmdsZV9fcmFkW3N0YXJ0c10sCiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZ19hdF9lbmQgPSB0ZW1wMiRmYWNpbmdfYW5nbGVfX3JhZFtlbmRzXQogICAgICAgICAgICAgICAgICAgICAgICApCiAgZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZyA8LSBiaW5kX3Jvd3MoZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZyx0ZW1wX3RpYmJsZSkKfQpmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nCmBgYAoKCgo8YnIvPgo8YnIvPgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KcDEgPC0gZ2dwbG90KGZhY2luZ19zdGFydF9hbmRfZW5kX3dpbmcsIGFlcyh4PWdlbm90eXBlLHk9ZmFjaW5nX2F0X3N0YXJ0KSkgKwogIGdlb21fYm94cGxvdCgpCnAyIDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9lbmQpKSArCiAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gZ2dwbG90KGZhY2luZ19zdGFydF9hbmRfZW5kX3dpbmcsIGFlcyh4PWdlbm90eXBlLHk9ZmFjaW5nX2F0X3N0YXJ0L2ZhY2luZ19hdF9lbmQpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHlsaW0oMCwyKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIGxhYmVscyA9IGMoIkZhY2luZyBBbmdsZSBhdCBTdGFydCIsIkZhY2luZyBBbmdsZSBhdCBFbmQiLCJSYXRpbyBzdGFydDplbmQiKSwKICAgICAgICAgIGhqdXN0ID0gLTAuMiwKICAgICAgICAgIHZqdXN0ID0gMS42LAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCgo8YnIvPgo8YnIvPgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CnAxIDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9zdGFydC1mYWNpbmdfYXRfZW5kKSkgKwogIGdlb21fYm94cGxvdCgpKwogIHlsaW0oLTAuNSwwLjUpCnAyIDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9lbmQtZmFjaW5nX2F0X3N0YXJ0KSkgKwogIGdlb21fYm94cGxvdCgpKwogIHlsaW0oLTAuNSwwLjUpCnAzIDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9zdGFydC9mYWNpbmdfYXRfZW5kKSkgKwogIGdlb21fYm94cGxvdCgpICsKICB5bGltKDAsMikKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyksCiAgICAgICAgICBsYWJlbHMgPSBjKCJTdGFydC1FbmQiLCJFbmQtU3RhcnQiLCJSYXRpbyBzdGFydDplbmQiKSwKICAgICAgICAgIGhqdXN0ID0gLTAuMiwKICAgICAgICAgIHZqdXN0ID0gMS42LAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKYGBgCgoKCgoKCgoKPGJyLz4KPGJyLz4KCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQpwMSA8LSBnZ3Bsb3QoZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZywgYWVzKHg9Z2Vub3R5cGUseT1mYWNpbmdfYXRfc3RhcnQpKSArCiAgZ2VvbV92aW9saW4oKQpwMiA8LSBnZ3Bsb3QoZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZywgYWVzKHg9Z2Vub3R5cGUseT1mYWNpbmdfYXRfZW5kKSkgKwogIGdlb21fdmlvbGluKCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMiksCiAgICAgICAgICBsYWJlbHMgPSBjKCJGYWNpbmcgQW5nbGUgYXQgU3RhcnQiLCJGYWNpbmcgQW5nbGUgYXQgRW5kIiksCiAgICAgICAgICAjaGp1c3QgPSAtMC42LAogICAgICAgICAgI3ZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCiMjIyAqKk1lYW4gZmFjaW5nIGFuZ2xlIGF0IHN0YXJ0IGFuZCBlbmQgb2YgYm91dCoqCgoKYGBge3J9CnRlbXAgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKQogIAp1bmlxX2ZseSA8LSB1bmlxdWUodGVtcCR1bmlxdWVfZmx5KQpmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nIDwtIHRpYmJsZSgpCmZvciAoZmx5IGluIHVuaXFfZmx5KSB7CiAgdGVtcDIgPC0gZmlsdGVyKHRlbXAsIHVuaXF1ZV9mbHkgPT0gZmx5KQogIGJvdXRzIDwtIHJsZSh0ZW1wMiRXaW5nR2VzdHVyZSkKICAKICBzdGFydHMgPC0gYXMubnVtZXJpYygpCiAgZm9yIChpIGluIHNlcSgxLGxlbmd0aCh3aGljaChib3V0cyR2YWx1ZXM9PTEpKSwxKSkgewogICAgc3RhcnRzW2ldID0gc3VtKGJvdXRzJGxlbmd0aHNbMTooaSoyKS0xXSkrMQogIH0KICBlbmRzIDwtIGFzLm51bWVyaWMoKQogIGZvciAoaSBpbiBzZXEoMSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSksMSkpIHsKICAgIGVuZHNbaV0gPSBzdW0oYm91dHMkbGVuZ3Roc1sxOihpKjIpXSkKICB9CiAgZ2Vub3R5cGUgPSB1bmlxdWUodGVtcDIkZ2Vub3R5cGUpCiAgdW5pX2lkID0gdW5pcXVlKHRlbXAyJHVuaXF1ZV9mbHkpCiAgCiAgdGVtcF90aWJibGUgPC0gdGliYmxlKHVuaXF1ZV9mbHkgPSB1bmlfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGdlbm90eXBlID0gZ2Vub3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZ19hdF9zdGFydCA9IG1lYW4odGVtcDIkZmFjaW5nX2FuZ2xlX19yYWRbc3RhcnRzXSksCiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZ19hdF9lbmQgPSBtZWFuKHRlbXAyJGZhY2luZ19hbmdsZV9fcmFkW2VuZHNdKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZyA8LSBiaW5kX3Jvd3MoZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZyx0ZW1wX3RpYmJsZSkKfQpmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nCmBgYAoKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CnAxIDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9zdGFydCkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgeWxpbSgwLDEpCnAyIDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9lbmQpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHlsaW0oMCwxKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyKSwKICAgICAgICAgIGxhYmVscyA9IGMoIm1lYW4gRmFjaW5nIEFuZ2xlIGF0IFN0YXJ0IiwibWVhbiBGYWNpbmcgQW5nbGUgYXQgRW5kIiksCiAgICAgICAgICAjaGp1c3QgPSAtMC42LAogICAgICAgICAgI3ZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgbnJvdyA9IDEpCgpgYGAKCgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgojIyMgKipNZWRpYW4gZmFjaW5nIGFuZ2xlIGF0IHN0YXJ0IGFuZCBlbmQgb2YgYm91dCAodXNpbmcgV2luZ0dlc3R1cmUpKioKCgpgYGB7cn0KdGVtcCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpCiAgCnVuaXFfZmx5IDwtIHVuaXF1ZSh0ZW1wJHVuaXF1ZV9mbHkpCmZhY2luZ19zdGFydF9hbmRfZW5kX3dpbmcgPC0gdGliYmxlKCkKZm9yIChmbHkgaW4gdW5pcV9mbHkpIHsKICB0ZW1wMiA8LSBmaWx0ZXIodGVtcCwgdW5pcXVlX2ZseSA9PSBmbHkpCiAgYm91dHMgPC0gcmxlKHRlbXAyJFdpbmdHZXN0dXJlKQogIAogIHN0YXJ0cyA8LSBhcy5udW1lcmljKCkKICBmb3IgKGkgaW4gc2VxKDEsbGVuZ3RoKHdoaWNoKGJvdXRzJHZhbHVlcz09MSkpLDEpKSB7CiAgICBzdGFydHNbaV0gPSBzdW0oYm91dHMkbGVuZ3Roc1sxOihpKjIpLTFdKSsxCiAgfQogIGVuZHMgPC0gYXMubnVtZXJpYygpCiAgZm9yIChpIGluIHNlcSgxLGxlbmd0aCh3aGljaChib3V0cyR2YWx1ZXM9PTEpKSwxKSkgewogICAgZW5kc1tpXSA9IHN1bShib3V0cyRsZW5ndGhzWzE6KGkqMildKQogIH0KICBnZW5vdHlwZSA9IHVuaXF1ZSh0ZW1wMiRnZW5vdHlwZSkKICB1bmlfaWQgPSB1bmlxdWUodGVtcDIkdW5pcXVlX2ZseSkKICAKICB0ZW1wX3RpYmJsZSA8LSB0aWJibGUodW5pcXVlX2ZseSA9IHVuaV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2Vub3R5cGUgPSBnZW5vdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgZmFjaW5nX2F0X3N0YXJ0ID0gbWVkaWFuKHRlbXAyJGZhY2luZ19hbmdsZV9fcmFkW3N0YXJ0c10pLAogICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmdfYXRfZW5kID0gbWVkaWFuKHRlbXAyJGZhY2luZ19hbmdsZV9fcmFkW2VuZHNdKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZyA8LSBiaW5kX3Jvd3MoZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZyx0ZW1wX3RpYmJsZSkKfQpmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nCmBgYAoKCgoKPGJyLz4KPGJyLz4KCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTh9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoV2luZ0dlc3R1cmU9PTEpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBtZWRpYW5fZmFjaW5nID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PW1lZGlhbl9mYWNpbmcpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMC41KQpwMiA8LSBnZ3Bsb3QoZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZywgYWVzKHg9Z2Vub3R5cGUseT1mYWNpbmdfYXRfc3RhcnQpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHlsaW0oMCwwLjUpCnAzIDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9lbmQpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHlsaW0oMCwwLjUpCnA0IDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9zdGFydC9mYWNpbmdfYXRfZW5kKSkgKwogIGdlb21fYm94cGxvdCgpICMrCiAgI3lsaW0oMCwwLjUpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygibWVkaWFuIEZhY2luZyBhbmdsZSB0aHJvdWdob3V0IiwibWVkaWFuIGF0IFN0YXJ0IG9mIGVhY2ggYm91dCIsIm1lZGlhbiBhdCBFbmQgb2YgZWFjaCBib3V0IiwicmF0aW8gc3RhcnQ6ZW5kIiksCiAgICAgICAgICBoanVzdCA9IC0wLjIsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gNCwKICAgICAgICAgIG5yb3cgPSAxKQpgYGAKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCiMjIyAqKk1lZGlhbiBmYWNpbmcgYW5nbGUgYXQgc3RhcnQgYW5kIGVuZCBvZiBib3V0ICh1c2luZyA+MzVkZWcpKioKCgpgYGB7cn0KdGVtcCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpCiAgCnVuaXFfZmx5IDwtIHVuaXF1ZSh0ZW1wJHVuaXF1ZV9mbHkpCmZhY2luZ19zdGFydF9hbmRfZW5kX3dpbmcgPC0gdGliYmxlKCkKZm9yIChmbHkgaW4gdW5pcV9mbHkpIHsKICB0ZW1wMiA8LSBmaWx0ZXIodGVtcCwgdW5pcXVlX2ZseSA9PSBmbHkpCiAgI2JvdXRzIDwtIHJsZSh0ZW1wMiRXaW5nR2VzdHVyZSkKICB0ZW1wMiRiaW5fbWF4X3dpbmcgPC0gaWZlbHNlKHRlbXAyJG1heF93aW5nX2FuZ19fcmFkID49ICgzNSpwaS8xODApLDEsMCkKICB0ZW1wMiRiaW5fbWF4X3dpbmcgPC0gdGVtcDIkYmluX21heF93aW5nICU+JSByZXBsYWNlX25hKDApCiAgYm91dHMgPC0gcmxlKHRlbXAyJGJpbl9tYXhfd2luZykKCiAgc3RhcnRzIDwtIGFzLm51bWVyaWMoKQogIGZvciAoaSBpbiBzZXEoMSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSksMSkpIHsKICAgIHN0YXJ0c1tpXSA9IHN1bShib3V0cyRsZW5ndGhzWzE6KGkqMiktMV0pKzEKICB9CiAgZW5kcyA8LSBhcy5udW1lcmljKCkKICBmb3IgKGkgaW4gc2VxKDEsbGVuZ3RoKHdoaWNoKGJvdXRzJHZhbHVlcz09MSkpLDEpKSB7CiAgICBlbmRzW2ldID0gc3VtKGJvdXRzJGxlbmd0aHNbMTooaSoyKV0pCiAgfQogIGdlbm90eXBlID0gdW5pcXVlKHRlbXAyJGdlbm90eXBlKQogIHVuaV9pZCA9IHVuaXF1ZSh0ZW1wMiR1bmlxdWVfZmx5KQogIAogIHRlbXBfdGliYmxlIDwtIHRpYmJsZSh1bmlxdWVfZmx5ID0gdW5pX2lkLAogICAgICAgICAgICAgICAgICAgICAgICBnZW5vdHlwZSA9IGdlbm90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmdfYXRfc3RhcnQgPSBtZWRpYW4odGVtcDIkZmFjaW5nX2FuZ2xlX19yYWRbc3RhcnRzXSksCiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZ19hdF9lbmQgPSBtZWRpYW4odGVtcDIkZmFjaW5nX2FuZ2xlX19yYWRbZW5kc10pCiAgICAgICAgICAgICAgICAgICAgICAgICkKICBmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nIDwtIGJpbmRfcm93cyhmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLHRlbXBfdGliYmxlKQp9CmZhY2luZ19zdGFydF9hbmRfZW5kX3dpbmcKYGBgCgoKCjxici8+Cjxici8+CgoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9OH0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApKSAlPiUKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBtZWRpYW5fZmFjaW5nID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PW1lZGlhbl9mYWNpbmcpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMC41KQpwMiA8LSBnZ3Bsb3QoZmFjaW5nX3N0YXJ0X2FuZF9lbmRfd2luZywgYWVzKHg9Z2Vub3R5cGUseT1mYWNpbmdfYXRfc3RhcnQpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHlsaW0oMCwwLjUpCnAzIDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9lbmQpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIHlsaW0oMCwwLjUpCnA0IDwtIGdncGxvdChmYWNpbmdfc3RhcnRfYW5kX2VuZF93aW5nLCBhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hdF9zdGFydC9mYWNpbmdfYXRfZW5kKSkgKwogIGdlb21fYm94cGxvdCgpICMrCiAgI3lsaW0oMCwwLjUpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMscDQpLAogICAgICAgICAgbGFiZWxzID0gYygibWVkaWFuIEZhY2luZyBhbmdsZSB0aHJvdWdob3V0IiwibWVkaWFuIGF0IFN0YXJ0IG9mIGVhY2ggYm91dCIsIm1lZGlhbiBhdCBFbmQgb2YgZWFjaCBib3V0IiwicmF0aW8gc3RhcnQ6ZW5kIiksCiAgICAgICAgICBoanVzdCA9IC0wLjIsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gNCwKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgoKCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCgoKCgojIyMgKipGYWNpbmcgYW5nbGVzIHdpdGggd2luZyBleHRlbmRlZCB1c2luZyBXaW5nR2VzdHVyZSoqCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9Nn0KcDEgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihXaW5nR2VzdHVyZT09MSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hbmdsZV9fcmFkKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIoV2luZ0dlc3R1cmU9PTEpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBtZWRpYW5fZmFjaW5nID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PW1lZGlhbl9mYWNpbmcpKSArCiAgICBnZW9tX2JveHBsb3QoKSArCiAgICB5bGltKDAsMSkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSE9IkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikgJT4lIAogIGZpbHRlcihXaW5nR2VzdHVyZT09MSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIG1lYW5fZmFjaW5nID0gbWVhbihmYWNpbmdfYW5nbGVfX3JhZCkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1tZWFuX2ZhY2luZykpICsKICAgIGdlb21fYm94cGxvdCgpICsKICAgIHlsaW0oMCwxKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIGxhYmVscyA9IGMoIkZhY2luZyBBbmdsZSIsIm1lZGlhbiBGYWNpbmcgQW5nbGUiLCJtZWFuIEZhY2luZyBBbmdsZSIpLAogICAgICAgICAgI2hqdXN0ID0gLTAuNiwKICAgICAgICAgICN2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAxKQpgYGAKCgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCgoKIyMjICoqRmFjaW5nIGFuZ2xlcyB3aXRoIHdpbmcgZXh0ZW5kZWQgdXNpbmcgbWF4X3dpbmc+MzUqKgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD02fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKSAlPiUgCiAgZmlsdGVyKG1heF93aW5nX2FuZ19fcmFkID4gKDM1KnBpLzE4MCkpICU+JQogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PWZhY2luZ19hbmdsZV9fcmFkKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgbWVkaWFuX2ZhY2luZyA9IG1lZGlhbihmYWNpbmdfYW5nbGVfX3JhZCkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1tZWRpYW5fZmFjaW5nKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgbWVhbl9mYWNpbmcgPSBtZWFuKGZhY2luZ19hbmdsZV9fcmFkKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PW1lYW5fZmFjaW5nKSkgKwogICAgZ2VvbV9ib3hwbG90KCkgKwogICAgeWxpbSgwLDEpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygiRmFjaW5nIEFuZ2xlIiwibWVkaWFuIEZhY2luZyBBbmdsZSIsIm1lYW4gRmFjaW5nIEFuZ2xlIiksCiAgICAgICAgICAjaGp1c3QgPSAtMC42LAogICAgICAgICAgI3ZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKICAKCjxici8+Cjxici8+CgoKCgoKYGBge3J9CnRlc3Rfc3RhdF90aWJibGUwIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUhPSJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpICU+JSAKICBmaWx0ZXIobWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSkgJT4lCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgZmFjaW5nID0gbWVkaWFuKGZhY2luZ19hbmdsZV9fcmFkKSkgCmFvdjAgPC0gYW92KGZhY2luZ35nZW5vdHlwZSxkYXRhID0gdGVzdF9zdGF0X3RpYmJsZTApCiNzdW1tYXJ5KGFvdjApClR1a2V5SFNEKGFvdjApCmBgYAoKCgoKCgoKCgoKCgoKCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKPGJyLz4KPGJyLz4KCgo8YnIvPgo8YnIvPgoKCjxici8+Cjxici8+CgoKCgpgYGB7cn0KdGVzdCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzYpIApgYGAKCgpgYGB7cn0KdGVtcDIgPC0gdGVzdAoKI2JvdXRzIDwtIHJsZSh0ZW1wMiRXaW5nR2VzdHVyZSkKdGVtcDIkYmluX21heF93aW5nIDwtIGlmZWxzZSh0ZW1wMiRtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApLDEsMCkKdGVtcDIkYmluX21heF93aW5nIDwtIHRlbXAyJGJpbl9tYXhfd2luZyAlPiUgcmVwbGFjZV9uYSgwKQpib3V0cyA8LSBybGUodGVtcDIkYmluX21heF93aW5nKQoKc3RhcnRzIDwtIGFzLm51bWVyaWMoKQpmb3IgKGkgaW4gc2VxKDEsbGVuZ3RoKHdoaWNoKGJvdXRzJHZhbHVlcz09MSkpLDEpKSB7CiAgc3RhcnRzW2ldID0gc3VtKGJvdXRzJGxlbmd0aHNbMTooaSoyKS0xXSkrMQp9CmVuZHMgPC0gYXMubnVtZXJpYygpCmZvciAoaSBpbiBzZXEoMSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSksMSkpIHsKICBlbmRzW2ldID0gc3VtKGJvdXRzJGxlbmd0aHNbMTooaSoyKV0pCn0KZ2Vub3R5cGUgPSByZXAodW5pcXVlKHRlbXAyJGdlbm90eXBlKSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSkpCnVuaV9pZCA9IHJlcCh1bmlxdWUodGVtcDIkdW5pcXVlX2ZseSksbGVuZ3RoKHdoaWNoKGJvdXRzJHZhbHVlcz09MSkpKQoKdGVtcF90aWJibGUgPC0gdGliYmxlKHVuaXF1ZV9mbHkgPSB1bmlfaWQsCiAgICAgICAgICAgICAgICAgICAgICBnZW5vdHlwZSA9IGdlbm90eXBlLAogICAgICAgICAgICAgICAgICAgICAgZmFjaW5nX2F0X3N0YXJ0ID0gdGVtcDIkZmFjaW5nX2FuZ2xlX19yYWRbc3RhcnRzXSwKICAgICAgICAgICAgICAgICAgICAgIGZhY2luZ19hdF9lbmQgPSB0ZW1wMiRmYWNpbmdfYW5nbGVfX3JhZFtlbmRzXQogICAgICAgICAgICAgICAgICAgICAgKQp0ZW1wX3RpYmJsZQoKYGBgCgoKYGBge3J9CnN0YXJ0cyA9IGZvciAoaSBpbiBzZXEoMSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSksMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0c1tpXSA9IHN1bShib3V0cyRsZW5ndGhzWzE6KGkqMiktMV0pKzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CnN0YXJ0cwpgYGAKCgoKCmBgYHtyfQoKdGVzdCRiaW5fbWF4X3dpbmcgPC0gaWZlbHNlKHRlc3QkbWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSwxLDApCnRlc3QkYmluX21heF93aW5nIDwtIHRlc3QkYmluX21heF93aW5nICU+JSByZXBsYWNlX25hKDApCiN0ZXN0JGJpbl9tYXhfd2luZwpib3V0cyA8LSBybGUodGVzdCRiaW5fbWF4X3dpbmcpCmJvdXRzCmBgYAoKCmBgYHtyfQpib3V0cyA8LSBybGUodGVzdCRXaW5nR2VzdHVyZSkKYm91dHMKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQp0ZXN0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNikgCgp0ZXN0JGJpbl9tYXhfd2luZyA8LSBpZmVsc2UodGVzdCRtYXhfd2luZ19hbmdfX3JhZCA+ICgzNSpwaS8xODApLDEsMCkKdGVzdCRiaW5fbWF4X3dpbmcgPC0gdGVzdCRiaW5fbWF4X3dpbmcgJT4lIHJlcGxhY2VfbmEoMCkKCnRlc3QgJT4lIAogIHNsaWNlKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6d2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PS13aW5nX2xfYW5nX19yYWQsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9d2luZ19yX2FuZ19fcmFkLCBjb2xvdXIgPSAiIzAwQkZDNCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKGJpbl9tYXhfd2luZz09MSwxLjYsLTEpKSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UobWF4X3dpbmdfYW5nX19yYWQ+PSgzNSpwaS8xODApLDEuOCwtMSkpKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShXaW5nR2VzdHVyZT09MSxXaW5nR2VzdHVyZSsxLFdpbmdHZXN0dXJlLTEpKSkpICsKICAgIHlsaW0oMCwyLjIpCmBgYAoKYGBge3J9CnN1bSh0ZXN0JGJpbl9tYXhfd2luZ1t3aGljaC5tYXgodGVzdCRTbW9vdGhlZENvdXJ0c2hpcCk6d2hpY2gubWF4KHRlc3QkU21vb3RoZWRDb3B1bGF0aW9uKV09PXRlc3QkV2luZ0dlc3R1cmVbd2hpY2gubWF4KHRlc3QkU21vb3RoZWRDb3VydHNoaXApOndoaWNoLm1heCh0ZXN0JFNtb290aGVkQ29wdWxhdGlvbildKQpzdW0odGVzdCRiaW5fbWF4X3dpbmdbd2hpY2gubWF4KHRlc3QkU21vb3RoZWRDb3VydHNoaXApOndoaWNoLm1heCh0ZXN0JFNtb290aGVkQ29wdWxhdGlvbildIT10ZXN0JFdpbmdHZXN0dXJlW3doaWNoLm1heCh0ZXN0JFNtb290aGVkQ291cnRzaGlwKTp3aGljaC5tYXgodGVzdCRTbW9vdGhlZENvcHVsYXRpb24pXSkKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQp0ZXN0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzXzMiKSAlPiUgCiAgZmlsdGVyKElkID09IDEpIAoKdGVzdCRiaW5fbWF4X3dpbmcgPC0gaWZlbHNlKHRlc3QkbWF4X3dpbmdfYW5nX19yYWQgPiAoMzUqcGkvMTgwKSwxLDApCnRlc3QkYmluX21heF93aW5nIDwtIHRlc3QkYmluX21heF93aW5nICU+JSByZXBsYWNlX25hKDApCgp0ZXN0ICU+JSAKICAjc2xpY2Uod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTp3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9LXdpbmdfbF9hbmdfX3JhZCwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT13aW5nX3JfYW5nX19yYWQsIGNvbG91ciA9ICIjMDBCRkM0IikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoYmluX21heF93aW5nPT0xLDEuNiwtMSkpKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShtYXhfd2luZ19hbmdfX3JhZD49KDM1KnBpLzE4MCksMS44LC0xKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKFdpbmdHZXN0dXJlPT0xLFdpbmdHZXN0dXJlKzEsV2luZ0dlc3R1cmUtMSkpKSkgKwogICAgeWxpbSgwLDIuMikKYGBgCgpgYGB7cn0KZ2dfY29sb3JfaHVlKDQpCmBgYAoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD02fQp0ZXN0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzXzMiKSAlPiUgCiAgZmlsdGVyKElkID09IDEpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKQoKdGVzdCRiaW5fbWF4X3dpbmcgPC0gaWZlbHNlKHRlc3QkbWF4X3dpbmdfYW5nX19yYWQgPj0gKDM1KnBpLzE4MCksMSwwKQp0ZXN0JGJpbl9tYXhfd2luZyA8LSB0ZXN0JGJpbl9tYXhfd2luZyAlPiUgcmVwbGFjZV9uYSgwKQoKdGVzdCAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1kaXN0X3RvX290aGVyX19tbSwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1TbW9vdGhlZERpc3RUb090aGVyLTEsIGNvbG91ciA9ICIjN0NBRTAwIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbi0yKSwgY29sb3VyPSAiIzAwQkZDNCIpKSArCgogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShiaW5fbWF4X3dpbmc9PTEsLTMsLTEwKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKG1heF93aW5nX2FuZ19fcmFkPj0oMzUqcGkvMTgwKSwtNCwtMTApKSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoV2luZ0dlc3R1cmU9PTEsLTYsLTEwKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKFNtb290aGVkQ291cnRzaGlwPT0xLDIwLC0xMCkpKSkgKwogICAgeWxpbSgtNiwyMCkKYGBgCgpgYGB7cn0KbWF4KHRlc3QkRnJhbWUpCmBgYAoKCgpgYGB7cn0KdGVtcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjNfMyIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMSkgJT4lIAogIGZpbHRlcihkaXN0X3RvX290aGVyX19tbSA+IDIpCgojYm91dHMgPC0gcmxlKHRlbXAyJFdpbmdHZXN0dXJlKQp0ZW1wMiRiaW5fbWF4X3dpbmcgPC0gaWZlbHNlKHRlbXAyJG1heF93aW5nX2FuZ19fcmFkID49ICgzNSpwaS8xODApLDEsMCkKdGVtcDIkYmluX21heF93aW5nIDwtIHRlbXAyJGJpbl9tYXhfd2luZyAlPiUgcmVwbGFjZV9uYSgwKQpib3V0cyA8LSBybGUodGVzdCRiaW5fbWF4X3dpbmcpCgpzdGFydHMgPC0gYXMubnVtZXJpYygpCmZvciAoaSBpbiBzZXEoMSxsZW5ndGgod2hpY2goYm91dHMkdmFsdWVzPT0xKSksMSkpIHsKICBzdGFydHNbaV0gPSBzdW0oYm91dHMkbGVuZ3Roc1sxOihpKjIpLTFdKSsxCn0KZW5kcyA8LSBhcy5udW1lcmljKCkKZm9yIChpIGluIHNlcSgxLGxlbmd0aCh3aGljaChib3V0cyR2YWx1ZXM9PTEpKSwxKSkgewogIGVuZHNbaV0gPSBzdW0oYm91dHMkbGVuZ3Roc1sxOihpKjIpXSkKfQpnZW5vdHlwZSA9IHVuaXF1ZSh0ZW1wMiRnZW5vdHlwZSkKdW5pX2lkID0gdW5pcXVlKHRlbXAyJHVuaXF1ZV9mbHkpCgp0ZW1wX3RpYmJsZSA8LSB0aWJibGUodW5pcXVlX2ZseSA9IHVuaV9pZCwKICAgICAgICAgICAgICAgICAgICAgIGdlbm90eXBlID0gZ2Vub3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICBmYWNpbmdfYXRfc3RhcnQgPSBtZWRpYW4odGVtcDIkZmFjaW5nX2FuZ2xlX19yYWRbc3RhcnRzXSksCiAgICAgICAgICAgICAgICAgICAgICBmYWNpbmdfYXRfZW5kID0gbWVkaWFuKHRlbXAyJGZhY2luZ19hbmdsZV9fcmFkW2VuZHNdKQogICAgICAgICAgICAgICAgICAgICAgKQp0ZW1wX3RpYmJsZQpgYGAKCgoKCgpgYGB7cn0KYm91dHMgPC0gcmxlKHRlc3QkYmluX21heF93aW5nKQpib3V0cwpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyM18zIikgJT4lIAogIGZpbHRlcihJZCA9PSAyMSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9U21vb3RoZWRDb3VydHNoaXAsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpICMrCiAgICAjeGxpbSgyMDAwLDMwMDApCmBgYAoKCgoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzYpICU+JQogICNzbGljZSh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOndoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT13aW5nX2xfYW5nX19yYWQsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9d2luZ19yX2FuZ19fcmFkLCBjb2xvdXIgPSAiIzAwQkZDNCIpKQogIApgYGAKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNikgJT4lCiAgc2xpY2Uod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTp3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSkgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9LXdpbmdfbF9hbmdfX3JhZCwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT13aW5nX3JfYW5nX19yYWQsIGNvbG91ciA9ICIjMDBCRkM0IikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoV2luZ0dlc3R1cmU9PTEsV2luZ0dlc3R1cmUrMC42LFdpbmdHZXN0dXJlLTAuMikpKSkKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM2KSAlPiUKICBzbGljZSh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOndoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0td2luZ19sX2FuZ19fcmFkLCBjb2xvdXIgPSAiI0Y4NzY2RCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PXdpbmdfcl9hbmdfX3JhZCwgY29sb3VyID0gIiMwMEJGQzQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShXaW5nR2VzdHVyZT09MSxXaW5nR2VzdHVyZSswLjYsTkEpKSkpCmBgYAoKCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9NH0KYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjM0XzIiKSAlPiUgCiAgZmlsdGVyKElkID09IDM2KSAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lLHk9ZGlzdF90b19vdGhlcl9fbW0pKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9YyhpZmVsc2UoU21vb3RoZWREaXN0VG9PdGhlcj4wLjUsIm5vdCBjb3B1bGF0aW5nIiwiY29wdWxhdGluZyIpKSkpKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShTbW9vdGhlZENvcHVsYXRpb249PTEsU21vb3RoZWRDb3B1bGF0aW9uKzYsTkEpKSkpCmBgYAoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQphbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKEZpbGVOYW1lID09ICJNZWdhbi0yMDE5XzAzXzA2X0NvdXJ0c2hpcC1Ec3hWZ2x1dFROVF9NYWxlXzEyMzRfMiIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMzYpICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PVNtb290aGVkRGlzdFRvT3RoZXIsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpICsKICAgIHhsaW0oMjAwMCwzMDAwKQpgYGAKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTR9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNikgJT4lIAogIGdncGxvdChhZXMoeD1GcmFtZSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9U21vb3RoZWRDb3VydHNoaXAsIGNvbG91ciA9ICIjRjg3NjZEIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9KFNtb290aGVkQ29wdWxhdGlvbiswLjEpLCBjb2xvdXI9ICIjMDBCRkM0IikpICMrCiAgICAjeGxpbSgyMDAwLDMwMDApCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojICoqVHJ5aW5nIHRvIG1ha2UgZnVuY3Rpb25zIGZvciBjb3VydHNoaXAgd2luZG93IGFuZCBjYWxjdWxhdGUgaW5kaWNlcy4uLiB0aGV5IGFyZW4ndCB3b3JraW5nIHJpZ2h0LCBhbmQgc2VlbSB0byBiZSBpZ25vcmluZyB0aGUgZ3JvdXBpbmcgb2YgdGhlIHRpYmJsZSBhbmQgcmV0dXJuaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBldmVyeSBpbmRpdmlkdWFsLi4uKioKCklmIGkgaGF2ZSB0byBmb3IgbG9vcCBvdmVyIHRoZSBncm91cHMgb2YgYSB0aWJibGUsIHRoZSBiZWxvdyBsaW5lIG1pZ2h0IGJlIHVzZWZ1bGwuCmRpbSh1bmlxdWUoYWxsX3Jhd2RhdGFbYWxsX3Jhd2RhdGEgJT4lIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgZ3JvdXBfdmFycygpXSkpWzFdCgoKCgoKCmBgYHtyfQpjb3VydHNoaXBfd2luZG93IDwtIGZ1bmN0aW9uKGlucHV0LHdpbmQ9NjAwLC4uLil7CiAgdGVtcF90aWJibGUgPC0gc3VtbWFyaXNlKGlucHV0LCBzdGFydF9vZl9jb3VydHNoaXAgPSB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX29mX2NvdXJ0c2hpcCA9IGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogIHJldHVybih0ZW1wX3RpYmJsZSRzdGFydF9vZl9jb3VydHNoaXA6dGVtcF90aWJibGUkZW5kX29mX2NvdXJ0c2hpcCkKICAjcmV0dXJuKGModGVtcF90aWJibGUkc3RhcnRfb2ZfY291cnRzaGlwLHRlbXBfdGliYmxlJGVuZF9vZl9jb3VydHNoaXApKQogICNyZXR1cm4odGVtcF90aWJibGUpCn0KYGBgCgoKYGBge3J9CmNvdXJ0c2hpcF93aW5kb3cgPC0gZnVuY3Rpb24oaW5wdXQsd2luZD02MDAsLi4uKXsKICB0ZW1wX3RpYmJsZSA8LSBzdW1tYXJpc2UoaW5wdXQsIHN0YXJ0X29mX2NvdXJ0c2hpcCA9IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfb2ZfY291cnRzaGlwID0gaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgI3JldHVybih0ZW1wX3RpYmJsZSRzdGFydF9vZl9jb3VydHNoaXA6dGVtcF90aWJibGUkZW5kX29mX2NvdXJ0c2hpcCkKICByZXR1cm4oYyh0ZW1wX3RpYmJsZSRzdGFydF9vZl9jb3VydHNoaXAsdGVtcF90aWJibGUkZW5kX29mX2NvdXJ0c2hpcCkpCiAgI3JldHVybih0ZW1wX3RpYmJsZSkKfQpgYGAKCgoKCgoKCgpgYGB7cn0KY291cnRzaGlwX3dpbmRvdyh0ZXN0LCB3aW5kID0gNjAwKQpgYGAKCgoKCgpgYGB7cn0KdGVtcCA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlIT0iQ1MgZmVtYWxlIikKCnVuaXFfZmx5IDwtIHVuaXF1ZSh0ZW1wJHVuaXF1ZV9mbHkpCmNvdXJ0aW5nX2ZyYW1lcyA8LSB0aWJibGUoKQpmb3IgKGZseSBpbiB1bmlxX2ZseSkgewogIHRlbXAyIDwtIHRlbXAgJT4lIGZpbHRlcih1bmlxdWVfZmx5ID09IGZseSkgCiAgdGVtcDIgPC0gc2xpY2UodGVtcDIsIHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKICBjb3VydGluZ19mcmFtZXMgPC0gYmluZF9yb3dzKGNvdXJ0aW5nX2ZyYW1lcyx0ZW1wMikKfQpjb3VydGluZ19mcmFtZXMKYGBgCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD02fQp0ZXN0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzXzMiKSAlPiUgCiAgZmlsdGVyKElkID09IDEpICU+JSAKICBmaWx0ZXIoZGlzdF90b19vdGhlcl9fbW0gPiAyKQoKI3Rlc3QkYmluX21heF93aW5nIDwtIGlmZWxzZSh0ZXN0JG1heF93aW5nX2FuZ19fcmFkID49ICgzNSpwaS8xODApLDEsMCkKI3Rlc3QkYmluX21heF93aW5nIDwtIHRlc3QkYmluX21heF93aW5nICU+JSByZXBsYWNlX25hKDApCgp0ZXN0ICU+JSAKICBnZ3Bsb3QoYWVzKHg9RnJhbWUpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWRpc3RfdG9fb3RoZXJfX21tLCBjb2xvdXIgPSAiI0Y4NzY2RCIpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PVNtb290aGVkRGlzdFRvT3RoZXItMSwgY29sb3VyID0gIiM3Q0FFMDAiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT0oU21vb3RoZWRDb3B1bGF0aW9uLTIpLCBjb2xvdXI9ICIjMDBCRkM0IikpICsKCiAgICAjZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShiaW5fbWF4X3dpbmc9PTEsLTMsLTEwKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKG1heF93aW5nX2FuZ19fcmFkPj0oMzUqcGkvMTgwKSwtNCwtMTApKSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoV2luZ0dlc3R1cmU9PTEsLTYsLTEwKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKFNtb290aGVkQ291cnRzaGlwPT0xLDIwLC0xMCkpKSkgKwogICAgeWxpbSgtNiwyMCkKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9Nn0KdGVzdCA8LSBjb3VydGluZ19mcmFtZXMgJT4lIAogIGZpbHRlcihGaWxlTmFtZSA9PSAiTWVnYW4tMjAxOV8wM18wNl9Db3VydHNoaXAtRHN4VmdsdXRUTlRfTWFsZV8xMjNfMyIpICU+JSAKICBmaWx0ZXIoSWQgPT0gMSkgIyU+JSAKICAjZmlsdGVyKGRpc3RfdG9fb3RoZXJfX21tID4gMikKCiN0ZXN0JGJpbl9tYXhfd2luZyA8LSBpZmVsc2UodGVzdCRtYXhfd2luZ19hbmdfX3JhZCA+PSAoMzUqcGkvMTgwKSwxLDApCiN0ZXN0JGJpbl9tYXhfd2luZyA8LSB0ZXN0JGJpbl9tYXhfd2luZyAlPiUgcmVwbGFjZV9uYSgwKQoKdGVzdCAlPiUgCiAgZ2dwbG90KGFlcyh4PUZyYW1lKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1kaXN0X3RvX290aGVyX19tbSwgY29sb3VyID0gIiNGODc2NkQiKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1pZmVsc2UoU21vb3RoZWREaXN0VG9PdGhlcj09MSwxLC0xMCksIGNvbG91ciA9ICIjN0NBRTAwIikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9aWZlbHNlKFNtb290aGVkQ29wdWxhdGlvbj09MCwtMiwtMTApLCBjb2xvdXI9ICIjMDBCRkM0IikpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9aWZlbHNlKENvcHVsYXRpb249PTAsLTEsLTEwKSwgY29sb3VyPSAiIzAwQkZDNCIpKSArCgogICAgI2dlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoYmluX21heF93aW5nPT0xLC0zLC0xMCkpKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShtYXhfd2luZ19hbmdfX3JhZD49KDM1KnBpLzE4MCksLTQsLTEwKSkpKSArCiAgICBnZW9tX3BvaW50KGFlcyh5PWMoaWZlbHNlKFdpbmdHZXN0dXJlPT0xLC02LC0xMCkpKSkgKwogICAgZ2VvbV9wb2ludChhZXMoeT1jKGlmZWxzZShTbW9vdGhlZENvdXJ0c2hpcD09MSwyMCwtMTApKSkpICsKICAgIGdlb21fcG9pbnQoYWVzKHk9YyhpZmVsc2UoQ291cnRzaGlwPT0xLDE4LC0xMCkpKSkgKwogICAgeWxpbSgtNiwyMCkKYGBgCgoKCgoKCgoKYGBge3J9CgpgYGAKCgpgYGB7cn0KCmBgYAoKCmBgYHtyfQoKYGBgCgpgYGB7cn0KCmBgYAoKCmBgYHtyfQoKYGBgCgoKCgoKCgoKYGBge3J9CmNhbGN1bGF0ZV9pbmRpY2VzIDwtIGZ1bmN0aW9uKGlucHV0ID0gLixmZWF0dXJlLGphYWJhPVRSVUUsdGhyZXNoPU5VTEwsd2luZD02MDApewogIGlmIChmZWF0dXJlICVpbiUgbmFtZXMoaW5wdXQpKSB7CiAgICB2YXJfaW5kID0gcGFzdGUwKGZlYXR1cmUsIl9pbmRleCIpCiAgICBpZiAoamFhYmEpIHsKICAgICAgdGVtcF90aWJibGUgPC0gc3VtbWFyaXNlKGlucHV0LCBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhdmFyX2luZCA6PSAxMDAqc3VtKGlucHV0W1tmZWF0dXJlXV1bd2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3VydHNoaXAiXV0pOmlmZWxzZSh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvcHVsYXRpb24iXV0pID4gd2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3VydHNoaXAiXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ29wdWxhdGlvbiJdXSkgPD0gKHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKSsoMjUqd2luZCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvcHVsYXRpb24iXV0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKSsoMjUqd2luZCkpLG1heChpbnB1dFtbIkZyYW1lIl1dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3VydHNoaXAiXV0pKygyNSp3aW5kKSksbWF4KGlucHV0W1siRnJhbWUiXV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICldKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChpbnB1dFtbIkZyYW1lIl1dW3doaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKTppZmVsc2Uod2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3B1bGF0aW9uIl1dKSA+IHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvcHVsYXRpb24iXV0pIDw9ICh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvdXJ0c2hpcCJdXSkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3B1bGF0aW9uIl1dKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvdXJ0c2hpcCJdXSkrKDI1KndpbmQpKSxtYXgoaW5wdXRbWyJGcmFtZSJdXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKSsoMjUqd2luZCkpLG1heChpbnB1dFtbIkZyYW1lIl1dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXSkKICAgICAgICAgICAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHRlbXBfdGliYmxlIDwtIHN1bW1hcmlzZShpbnB1dCwgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIXZhcl9pbmQgOj0gMTAwKnN1bShpbnB1dFtbZmVhdHVyZV1dW3doaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKTppZmVsc2Uod2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3B1bGF0aW9uIl1dKSA+IHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvcHVsYXRpb24iXV0pIDw9ICh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvdXJ0c2hpcCJdXSkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3B1bGF0aW9uIl1dKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvdXJ0c2hpcCJdXSkrKDI1KndpbmQpKSxtYXgoaW5wdXRbWyJGcmFtZSJdXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKSsoMjUqd2luZCkpLG1heChpbnB1dFtbIkZyYW1lIl1dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXT50aHJlc2gsbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChpbnB1dFtbIkZyYW1lIl1dW3doaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKTppZmVsc2Uod2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3B1bGF0aW9uIl1dKSA+IHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvcHVsYXRpb24iXV0pIDw9ICh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvdXJ0c2hpcCJdXSkrKDI1KndpbmQpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KGlucHV0W1siU21vb3RoZWRDb3B1bGF0aW9uIl1dKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoaW5wdXRbWyJTbW9vdGhlZENvdXJ0c2hpcCJdXSkrKDI1KndpbmQpKSxtYXgoaW5wdXRbWyJGcmFtZSJdXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChpbnB1dFtbIlNtb290aGVkQ291cnRzaGlwIl1dKSsoMjUqd2luZCkpLG1heChpbnB1dFtbIkZyYW1lIl1dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXSkKICAgICAgICAgICAgICAgICkKICAgIH0KICAgIHJldHVybih0ZW1wX3RpYmJsZSkKICB9IGVsc2UgewogICAgbWVzc2FnZShwYXN0ZTAoZmVhdHVyZSwgIiBkb2VzIG5vdCBleGlzdCBpbiB0YWJsZSIpKQogIH0KfSAKYGBgCgoKCgoKCmBgYHtyfQpjYWxjdWxhdGVfaW5kaWNlcyA8LSBmdW5jdGlvbihpbnB1dCxmZWF0dXJlLGphYWJhPVRSVUUsdGhyZXNoPU5VTEwpewogIGlmIChmZWF0dXJlICVpbiUgbmFtZXMoaW5wdXQpKSB7CiAgICB2YXJfaW5kID0gcGFzdGUwKGZlYXR1cmUsIl9pbmRleCIpCiAgICBpZiAoamFhYmEpIHsKICAgICAgdGVtcF90aWJibGUgPC0gc3VtbWFyaXNlKGlucHV0LCBnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhdmFyX2luZCA6PSAxMDAqc3VtKGlucHV0W1tmZWF0dXJlXV1bY291cnRzaGlwX3dpbmRvdyhpbnB1dCldKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChpbnB1dFtbIkZyYW1lIl1dW2NvdXJ0c2hpcF93aW5kb3coaW5wdXQpXSkKICAgICAgICAgICAgICAgICkKICAgIH0gZWxzZSB7CiAgICAgIHRlbXBfdGliYmxlIDwtIHN1bW1hcmlzZShpbnB1dCwgZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIXZhcl9pbmQgOj0gMTAwKnN1bShpbnB1dFtbZmVhdHVyZV1dW2NvdXJ0c2hpcF93aW5kb3coaW5wdXQpXT50aHJlc2gsbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aChpbnB1dFtbIkZyYW1lIl1dW2NvdXJ0c2hpcF93aW5kb3coaW5wdXQpXSkKICAgICAgICAgICAgICAgICkKICAgIH0KICAgIHJldHVybih0ZW1wX3RpYmJsZSkKICB9IGVsc2UgewogICAgbWVzc2FnZShwYXN0ZTAoZmVhdHVyZSwgIiBkb2VzIG5vdCBleGlzdCBpbiB0YWJsZSIpKQogIH0KfSAKYGBgCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgY2FsY3VsYXRlX2luZGljZXMoZmVhdHVyZSA9ICJtYXhfd2luZ19hbmdfX3JhZCIsamFhYmEgPSBGQUxTRSx0aHJlc2ggPSAoMjUqcGkvMTgwKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PW1heF93aW5nX2FuZ19fcmFkX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDIgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBjYWxjdWxhdGVfaW5kaWNlcyhmZWF0dXJlID0gIndpbmdfbF9hbmdfX3JhZCIsamFhYmEgPSBGQUxTRSx0aHJlc2ggPSAoMjUqcGkvMTgwKSkgJT4lIAogIGdncGxvdChhZXMoeD1nZW5vdHlwZSx5PXdpbmdfbF9hbmdfX3JhZF9pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAzIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgY2FsY3VsYXRlX2luZGljZXMoZmVhdHVyZSA9ICJ3aW5nX3JfYW5nX19yYWQiLGphYWJhID0gRkFMU0UsdGhyZXNoID0gKDI1KnBpLzE4MCkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT13aW5nX3JfYW5nX19yYWRfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpnZ2FycmFuZ2UocGxvdGxpc3QgPSBsaXN0KHAxLHAyLHAzKSwKICAgICAgICAgIGxhYmVscyA9IGMoIndpbmcgaW5kZXgiLCJsZWZ0IHdpbmciLCJyaWdodCB3aW5nIiksCiAgICAgICAgICBoanVzdCA9IC0wLjYsCiAgICAgICAgICB2anVzdCA9IDIsCiAgICAgICAgICBuY29sID0gMywKICAgICAgICAgIG5yb3cgPSAxKQoKYGBgCgoKCgoKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnAxIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICB3aW5nX2luZGV4ID0gMTAwKnN1bShtYXhfd2luZ19hbmdfX3JhZFtjb3VydHNoaXBfd2luZG93KGlucHV0KV0+KDQwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW2NvdXJ0c2hpcF93aW5kb3coaW5wdXQpXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBsZWZ0X3dpbmdfaW5kZXggPSAxMDAqc3VtKHdpbmdfbF9hbmdfX3JhZFtjb3VydHNoaXBfd2luZG93KGlucHV0KV08KC00MCpwaS8xODApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgIGxlbmd0aChGcmFtZVtjb3VydHNoaXBfd2luZG93KGlucHV0KV0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9bGVmdF93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKcDMgPC0gYWxsX3Jhd2RhdGEgJT4lIAogIGZpbHRlcihnZW5vdHlwZSAhPSAiQ1MgZmVtYWxlIikgJT4lIAogIGdyb3VwX2J5KGdlbm90eXBlKSAlPiUgCiAgZ3JvdXBfYnkodW5pcXVlX2ZseSkgJT4lIAogIHN1bW1hcmlzZShnZW5vdHlwZSA9IHVuaXF1ZShnZW5vdHlwZSksCiAgICAgICAgICAgIHJpZ2h0X3dpbmdfaW5kZXggPSAxMDAqc3VtKHdpbmdfcl9hbmdfX3JhZFtjb3VydHNoaXBfd2luZG93KGlucHV0KV0+KDQwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW2NvdXJ0c2hpcF93aW5kb3coaW5wdXQpXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1yaWdodF93aW5nX2luZGV4KSkgKwogICAgZ2VvbV9ib3hwbG90KCkKZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbGlzdChwMSxwMixwMyksCiAgICAgICAgICBsYWJlbHMgPSBjKCJ3aW5nIGluZGV4IiwibGVmdCB3aW5nIiwicmlnaHQgd2luZyIpLAogICAgICAgICAgaGp1c3QgPSAtMC42LAogICAgICAgICAgdmp1c3QgPSAyLAogICAgICAgICAgbmNvbCA9IDMsCiAgICAgICAgICBucm93ID0gMSkKCmBgYAoKCgoKCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD00fQpwMSA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgd2luZ19pbmRleCA9IDEwMCpzdW0obWF4X3dpbmdfYW5nX19yYWRbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXT4oNDAqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUgCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9d2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCnAyIDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBncm91cF9ieShnZW5vdHlwZSkgJT4lIAogIGdyb3VwX2J5KHVuaXF1ZV9mbHkpICU+JSAKICBzdW1tYXJpc2UoZ2Vub3R5cGUgPSB1bmlxdWUoZ2Vub3R5cGUpLAogICAgICAgICAgICBsZWZ0X3dpbmdfaW5kZXggPSAxMDAqc3VtKHdpbmdfbF9hbmdfX3JhZFt3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApOmlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA+IHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSA8PSAod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqNjAwKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdPCgtNDAqcGkvMTgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICBsZW5ndGgoRnJhbWVbd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKTppZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPiB3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uod2hpY2gubWF4KFNtb290aGVkQ29wdWxhdGlvbikgPD0gKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KjYwMCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKCh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSp3aW5kKSksbWF4KEZyYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICApKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2Vub3R5cGUseT1sZWZ0X3dpbmdfaW5kZXgpKSArCiAgICBnZW9tX2JveHBsb3QoKQpwMyA8LSBhbGxfcmF3ZGF0YSAlPiUgCiAgZmlsdGVyKGdlbm90eXBlICE9ICJDUyBmZW1hbGUiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgc3VtbWFyaXNlKGdlbm90eXBlID0gdW5pcXVlKGdlbm90eXBlKSwKICAgICAgICAgICAgcmlnaHRfd2luZ19pbmRleCA9IDEwMCpzdW0od2luZ19yX2FuZ19fcmFkW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0+KDQwKnBpLzE4MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgbGVuZ3RoKEZyYW1lW3doaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCk6aWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pID4gd2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHdoaWNoLm1heChTbW9vdGhlZENvcHVsYXRpb24pIDw9ICh3aGljaC5tYXgoU21vb3RoZWRDb3VydHNoaXApKygyNSo2MDApKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaC5tYXgoU21vb3RoZWRDb3B1bGF0aW9uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oKHdoaWNoLm1heChTbW9vdGhlZENvdXJ0c2hpcCkrKDI1KndpbmQpKSxtYXgoRnJhbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbigod2hpY2gubWF4KFNtb290aGVkQ291cnRzaGlwKSsoMjUqd2luZCkpLG1heChGcmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbm90eXBlLHk9cmlnaHRfd2luZ19pbmRleCkpICsKICAgIGdlb21fYm94cGxvdCgpCmdnYXJyYW5nZShwbG90bGlzdCA9IGxpc3QocDEscDIscDMpLAogICAgICAgICAgbGFiZWxzID0gYygid2luZyBpbmRleCIsImxlZnQgd2luZyIsInJpZ2h0IHdpbmciKSwKICAgICAgICAgIGhqdXN0ID0gLTAuNiwKICAgICAgICAgIHZqdXN0ID0gMiwKICAgICAgICAgIG5jb2wgPSAzLAogICAgICAgICAgbnJvdyA9IDEpCmBgYAoKCgoKCgoKCgoKYGBge3J9CmFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgIT0gIkNTIGZlbWFsZSIpICU+JSAKICBmaWx0ZXIoZ2Vub3R5cGUgPT0gIkQiKSAlPiUgCiAgZ3JvdXBfYnkoZ2Vub3R5cGUpICU+JSAKICBncm91cF9ieSh1bmlxdWVfZmx5KSAlPiUgCiAgY2FsY3VsYXRlX2luZGljZXMoZmVhdHVyZSA9ICJtYXhfd2luZ19hbmdfX3JhZCIsamFhYmEgPSBGQUxTRSx0aHJlc2ggPSAoMjUqcGkvMTgwKSkKYGBgCgoKCgoKCmBgYHtyfQp0ZXN0IDwtIGFsbF9yYXdkYXRhICU+JSAKICBmaWx0ZXIoRmlsZU5hbWUgPT0gIk1lZ2FuLTIwMTlfMDNfMDZfQ291cnRzaGlwLURzeFZnbHV0VE5UX01hbGVfMTIzNF8yIikgJT4lIAogIGZpbHRlcihJZCA9PSAzNikgCmBgYAoKCmBgYHtyfQpjYWxjdWxhdGVfaW5kaWNlcyhpbnB1dCA9IHRlc3QsZmVhdHVyZSA9ICJXaW5nR2VzdHVyZSIsamFhYmEgPSBUUlVFKQpgYGAKCgoKYGBge3J9CmNhbGN1bGF0ZV9pbmRpY2VzKGlucHV0ID0gdGVzdCxmZWF0dXJlID0gIm1heF93aW5nX2FuZ19fcmFkIixqYWFiYSA9IEZBTFNFLHRocmVzaCA9ICgyNSpwaS8xODApKQpgYGAKCgoKCmBgYHtyfQpjYWxjdWxhdGVfaW5kaWNlcyhpbnB1dCA9IHRlc3QsZmVhdHVyZSA9ICJtYXhfd2luZ19hbmdsZV9fcmFkIixqYWFiYSA9IEZBTFNFLHRocmVzaCA9ICgyNSpwaS8xODApKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==